J'ai du mal à lier une simple propriété de chaîne statique à un TextBox.
Voici la classe avec la propriété static:
public class VersionManager
{
private static string filterString;
public static string FilterString
{
get { return filterString; }
set { filterString = value; }
}
}
Dans mon xaml, je veux juste lier cette propriété statique à un TextBox:
<TextBox>
<TextBox.Text>
<Binding Source="{x:Static local:VersionManager.FilterString}"/>
</TextBox.Text>
</TextBox>
Tout se compile, mais au moment de l'exécution, j'obtiens l'exception suivante:
Impossible de convertir la valeur de l'attribut «Source» en objet de type «System.Windows.Markup.StaticExtension». Erreur à l'objet 'System.Windows.Data.Binding' dans le fichier de balisage 'BurnDisk; component / selectversionpagefunction.xaml' Ligne 57 Position 29.
Une idée de ce que je fais mal?
la source
Vous ne pouvez pas vous lier à une statique comme celle-là. Il n'y a aucun moyen pour l'infrastructure de liaison d'être notifiée des mises à jour, car aucune
DependencyObject
instance (ou instance d'objet implémentéeINotifyPropertyChanged
) n'est impliquée.Si cette valeur ne change pas, abandonnez simplement la liaison et utilisez
x:Static
directement à l'intérieur de laText
propriété. Définissezapp
ci-dessous l'emplacement de l'espace de noms (et de l'assembly) de la classe VersionManager.Si la valeur change, je suggère de créer un singleton pour contenir la valeur et s'y lier.
Un exemple du singleton:
la source
Dans .NET 4.5, il est possible de se lier à des propriétés statiques, en savoir plus
la source
À partir de WPF 4.5, vous pouvez vous lier directement aux propriétés statiques et mettre à jour automatiquement la liaison lorsque votre propriété est modifiée. Vous devez câbler manuellement un événement de modification pour déclencher les mises à jour de liaison.
Vous pouvez maintenant lier votre propriété statique comme n'importe quelle autre:
la source
VersionManager
classe peut être statique et tout fonctionne toujours. Notez les accolades dans la définition du cheminPath=(local:VersionManager.FilterString)
. Est-ce que quelqu'un sait pourquoi ils sont réellement nécessaires?Il peut y avoir deux manières / syntaxe de lier une
static
propriété. Si p est unestatic
propriété de la classeMainWindow
, alorsbinding
fortextbox
sera:1.
2.
la source
Vous pouvez utiliser la
ObjectDataProvider
classe et saMethodName
propriété. Cela peut ressembler à ceci:Le fournisseur de données d'objets déclaré peut être utilisé comme ceci:
la source
Si vous utilisez des ressources locales, vous pouvez vous y référer comme ci-dessous:
la source
Variante appropriée pour .NET 4.5 +
Code C #
Liaison XAML (attention aux accolades qu'ils sont (), pas {})
la source
Regardez mon projet CalcBinding , qui vous permet d'écrire des expressions complexes dans la valeur de la propriété Path, y compris les propriétés statiques, les propriétés source, Math et autres. Donc, vous pouvez écrire ceci:
Bonne chance!
la source
Ces réponses sont toutes bonnes si vous voulez suivre de bonnes conventions mais que l'OP voulait quelque chose de simple , ce que je voulais aussi au lieu de traiter des modèles de conception d'interface graphique. Si tout ce que vous voulez faire est d'avoir une chaîne dans une application graphique de base, vous pouvez mettre à jour ad hoc sans rien de compliqué, vous pouvez simplement y accéder directement dans votre source C #.
Disons que vous avez une application WPF vraiment basique MainWindow XAML comme celle-ci,
Cela ressemblera à quelque chose comme ceci:
Dans la source de votre MainWindow XAML, vous pourriez avoir quelque chose comme ceci où tout ce que nous faisons pour changer la valeur directement via
textBlock.Text
'sget
/set
feature:Ensuite, lorsque vous déclenchez cet événement de clic en cliquant sur le bouton, le tour est joué! Kilroy apparaît :)
la source
Une autre solution consiste à créer une classe normale qui implémente PropertyChanger comme ceci
Ensuite, créez une instance statique de la classe quelque part que vous ne voudrez pas
Et maintenant, utilisez-le comme propriété statique
Et voici l'implémentation de PropertyChanger si nécessaire
la source
Réponse la plus simple (.net 4.5 et versions ultérieures):
et XAML:
Ne négligez pas les parenthèses
la source