如何将xaml属性绑定到另一个类中的静态变量?

时间:2013-04-06 18:48:04

标签: c# wpf xaml

我有这个xaml文件,其中我尝试将Text-block Background绑定到另一个类中的静态变量,我该如何实现?

我知道这可能很愚蠢,但我只是从Win-forms转移到感觉有点迷失。

这就是我的意思:

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

3 个答案:

答案 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}"/>