我有这个xaml文件,其中我尝试将Text-block Background绑定到另一个类中的静态变量,我该如何实现?
我知道这可能很愚蠢,但我只是从Win-forms转移到感觉有点迷失。
这就是我的意思:
<TextBlock Text="some text" TextWrapping="WrapWithOverflow" Foreground="{Binding Path=SomeVariable}" />
答案 0 :(得分:46)
首先,您无法绑定到variable
。您只能从XAML绑定到properties
。
对于绑定到静态属性,您可以这样做(假设您想绑定Text
的{{1}}属性) -
TextBlock
其中<TextBlock Text="{Binding Source={x:Static local:YourClassName.PropertyName}}"/>
是你的类所在的命名空间,你需要在xaml文件中声明它,如下所示 -
local
答案 1 :(得分:9)
你实际上无法绑定到静态属性(INotifyPropertyChanged仅对实例有意义),所以这应该足够......
{x:Static my:MyTestStaticClass.MyProperty}
或者例如
<TextBox Text="{x:Static my:MyTestStaticClass.MyProperty}" Width="500" Height="100" />
确保包含namespace
- 即在XAML中定义my
,如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);
...当然,如果您从代码中设置Binding,请删除XAML中的任何绑定。
OneWay
(属性从源头更改):如果你需要在源属性上更新目标(即控件的属性,本例中为Window.Left),那么静态类无法实现(根据我上面的评论,你我需要实现INotifyPropertyChanged
,所以你可以使用一个包装类,实现INotifyPropertyChanged
并将其连接到你感兴趣的静态属性(让你知道如何跟踪静态属性的变化,即这从这一点来看,这更像是一个“设计”问题,我建议重新设计并将其全部放在一个“非静态”类中。
答案 2 :(得分:2)
您可以使用较新的x:Bind
来执行此操作:
<TextBlock Text="{x:Bind YourClassName.PropertyName}"/>