35

我有这个 xaml 文件,我在其中尝试将文本块背景绑定到另一个类中的静态变量,我该如何实现?

我知道这可能很愚蠢,但我刚从 Win-forms 搬走,感觉有点失落。

这就是我的意思:

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

3 回答 3

60

首先你不能绑定到variable. 您只能properties从 XAML 绑定。对于绑定到静态属性,您可以通过这种方式进行(假设您想绑定Text的属性TextBlock) -

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

您的类所在local的命名空间在哪里,您需要在上面的 xaml 文件中声明,如下所示 -

xmlns:local="clr-namespace:YourNameSpace"
于 2013-04-06T18:52:40.583 回答
14

您实际上不能绑定到静态属性(INotifyPropertyChanged 仅对实例有意义),所以这应该足够了......

{x:Static my:MyTestStaticClass.MyProperty}  

或者例如

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

确保包含namespace- 即my在 XAML 中定义xmlns:my="clr-namespace:MyNamespace"


编辑:从代码绑定
(这部分有一些混合的答案,所以我认为扩展是有意义的,把它放在一个地方)


OneTime捆绑:

您可以只使用textBlock.Text = MyStaticClass.Left(请注意放置的位置,初始化后)

TwoWay(或OneWayToSource)绑定:

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);

...当然,如果您从代码中设置绑定,请删除 XAML 中的任何绑定。

OneWay(来自源的属性更改):

如果您需要在源属性更改时更新目标(即控件的属性,在这种情况下为 Window.Left),则静态类无法实现(根据我上面的评论,您需要已INotifyPropertyChanged实现,因此您可以只使用包装类,实现INotifyPropertyChanged并将其连接到您感兴趣的静态属性(前提是您知道如何跟踪静态属性的更改,即从这一点开始,这更像是一个“设计”问题,我建议重新设计并将其全部放在一个“非静态”类中)。

于 2013-04-06T19:09:15.597 回答
2

您可以使用较新的版本x:Bind来执行此操作,只需使用:

<TextBlock Text="{x:Bind YourClassName.PropertyName}"/>
于 2018-02-26T15:39:41.930 回答