我有这个 xaml 文件,我在其中尝试将文本块背景绑定到另一个类中的静态变量,我该如何实现?
我知道这可能很愚蠢,但我刚从 Win-forms 搬走,感觉有点失落。
这就是我的意思:
<TextBlock Text="some text"
TextWrapping="WrapWithOverflow"
Background="{Binding Path=SomeVariable}" />
首先你不能绑定到variable
. 您只能properties
从 XAML 绑定。对于绑定到静态属性,您可以通过这种方式进行(假设您想绑定Text
的属性TextBlock
) -
<TextBlock Text="{Binding Source={x:Static local:YourClassName.PropertyName}}"/>
您的类所在local
的命名空间在哪里,您需要在上面的 xaml 文件中声明,如下所示 -
xmlns:local="clr-namespace:YourNameSpace"
您实际上不能绑定到静态属性(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
并将其连接到您感兴趣的静态属性(前提是您知道如何跟踪静态属性的更改,即从这一点开始,这更像是一个“设计”问题,我建议重新设计并将其全部放在一个“非静态”类中)。
您可以使用较新的版本x:Bind
来执行此操作,只需使用:
<TextBlock Text="{x:Bind YourClassName.PropertyName}"/>