Question Comment puis-je lier une propriété xaml à une variable statique dans une autre classe?


J'ai ce fichier xaml dans lequel je tente de lier un arrière-plan de bloc de texte à une variable statique dans une autre classe. Comment puis-je y parvenir?

Je sais que cela peut être idiot mais je viens de passer de Win-forms et de me sentir un peu perdu.

voici ce que je veux dire:

   <TextBlock Text="some text"
                             TextWrapping="WrapWithOverflow"
                             Foreground="{Binding Path=SomeVariable}" />

25
2018-04-06 18:48


origine


Réponses:


Tout d'abord, vous ne pouvez pas vous lier à variable. Vous ne pouvez vous lier qu'à properties de XAML. Pour une liaison à une propriété statique, vous pouvez le faire de cette manière (par exemple, vous souhaitez lier Text propriété de TextBlock) -

<TextBlock Text="{Binding Source={x:Static local:YourClassName.PropertyName}}"/>

local est l'espace de noms où réside votre classe, que vous devez déclarer ci-dessus dans le fichier xaml comme ceci -

xmlns:local="clr-namespace:YourNameSpace"

41
2018-04-06 18:52



Vous ne pouvez pas réellement vous lier à une propriété statique (INotifyPropertyChanged a un sens uniquement sur les instances), cela devrait donc suffire ...

{x:Static my:MyTestStaticClass.MyProperty}  

ou par ex.

<TextBox Text="{x:Static my:MyTestStaticClass.MyProperty}" Width="500" Height="100" />  

assurez-vous d'inclure le namespace - c'est-à-dire définir le my dans le XAML comme xmlns:my="clr-namespace:MyNamespace" 


EDIT: liaison du code
(Il y a des réponses mitigées sur cette partie, alors j'ai pensé qu'il était logique de l'étendre, de l'avoir au même endroit)


OneTime contraignant:

Vous pourriez juste utiliser textBlock.Text = MyStaticClass.Left (attention juste où vous placez cela, post-init)

TwoWay (ou OneWayToSource) contraignant:

Binding binding = new Binding();
//binding.Source = typeof(MyStaticClass);
// System.InvalidOperationException: 'Binding.StaticSource cannot be set while using Binding.Source.'
binding.Path = new PropertyPath(typeof(MyStaticClass).GetProperty(nameof(MyStaticClass.Left)));
binding.Mode = BindingMode.TwoWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
this.SetBinding(Window.LeftProperty, binding);

... bien sûr si vous définissez la liaison à partir du code, supprimez toutes les liaisons dans XAML.

OneWay (propriété change de la source):

Et si vous avez besoin de mettre à jour la cible (la propriété du contrôle, Window.Left dans ce cas) sur les modifications de la propriété source, cela ne peut pas être réalisé avec la classe statique (selon mon commentaire ci-dessus, vous avez besoin de la INotifyPropertyChanged implémenté, vous pouvez donc utiliser une classe wrapper, implémenter INotifyPropertyChanged et connectez-le à une propriété statique de votre intérêt (à condition que vous sachiez comment suivre les modifications de vos propriétés statiques, c’est-à-dire qu’il s’agit désormais d’un problème de conception), -statique 'classe).


8
2018-04-06 19:09



Vous pouvez utiliser le plus récent x:Bind faire cela simplement en utilisant:

<TextBlock Text="{x:Bind YourClassName.PropertyName}"/>

0
2018-02-26 15:39