web-dev-qa-db-fra.com

Comment lier une propriété xaml à une variable statique dans une autre classe?

J'ai ce fichier xaml dans lequel j'essaie de lier un fond de bloc de texte à une variable statique d'une autre classe.

Je sais que c'est peut-être idiot, mais je viens de passer de Win-forms et je me sens un peu perdu.

voici ce que je veux dire:

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

Tout d’abord, vous ne pouvez pas vous lier à variable. Vous pouvez lier uniquement à properties à partir de XAML . Pour lier une propriété statique, vous pouvez le faire de cette manière (par exemple, vous voulez lier la propriété Text à TextBlock) -

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

local est l'espace de noms dans lequel votre classe réside et que vous devez déclarer ci-dessus dans un fichier xaml comme ceci -

xmlns:local="clr-namespace:YourNameSpace"
46
Rohit Vats

Vous ne pouvez pas réellement lier une propriété statique (INotifyPropertyChanged n’a de sens que sur les instances), cela devrait donc suffire ... 

{x:Static my:MyTestStaticClass.MyProperty}  

ou par exemple 

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

assurez-vous d’inclure la variable namespace - c’est-à-dire que vous définissez la variable my dans le code XAML comme xmlns:my="clr-namespace:MyNamespace" 


EDIT: liaison du code
(Il y a des réponses mitigées sur cette partie, j'ai donc pensé qu'il était logique d'élargir, de le placer au même endroit) 


OneTime binding:

Vous pouvez simplement utiliser textBlock.Text = MyStaticClass.Left (attention à l'endroit où vous le placez, post-init) 

TwoWay (ou OneWayToSource) obligatoire:

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 Binding à partir du code, supprimez toutes les liaisons en XAML.

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

Et si vous devez mettre à jour la cible (c'est-à-dire la propriété du contrôle, Window.Left dans ce cas) lorsque la propriété source change, cela ne peut pas être réalisé avec la classe statique (conformément à mon commentaire ci-dessus, il vous faudra la INotifyPropertyChanged implémentée, vous pouvez donc simplement utiliser une classe wrapper, implémenter INotifyPropertyChanged et relier cela à une propriété statique de votre intérêt (pour autant que vous sachiez suivre les modifications apportées à votre propriété statique, autrement dit, il s'agit davantage d'un problème de 'conception' à partir de maintenant. sur, je suggérerais de redessiner et de mettre tout cela dans une classe «non statique»).

8
NSGaga

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

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