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}" />
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}}"/>
où 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"
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»).
Vous pouvez utiliser le plus récent x:Bind
pour le faire simplement en utilisant:
<TextBlock Text="{x:Bind YourClassName.PropertyName}"/>