绑定到静态属性

我很难将简单的静态string属性绑定到文本框。

这是与静态属性的类:

public class VersionManager { private static string filterString; public static string FilterString { get { return filterString; } set { filterString = value; } } } 

在我的xaml中,我只想将这个静态属性绑定到一个文本框中:

 <TextBox> <TextBox.Text> <Binding Source="{x:Static local:VersionManager.FilterString}"/> </TextBox.Text> </TextBox> 

一切都编译完成,但在运行时,我得到以下exception:

无法将属性“Source”中的值转换为“System.Windows.Markup.StaticExtension”types的对象。 对象'System.Windows.Data.Binding'在标记文件'BurnDisk; component / selectversionpagefunction.xaml'Line 57 Position 29。

任何想法我做错了什么?

如果绑定需要双向,则必须提供path。 如果类不是静态的,那么对静态属性进行双向绑定是个窍门:在资源中声明类的虚拟实例,并将其用作绑定的源。

 <Window.Resources> <local:VersionManager x:Key="versionManager"/> </Window.Resources> ... <TextBox Text="{Binding Source={StaticResource versionManager}, Path=FilterString}"/> 

你不能绑定到这样的静态。 由于没有DependencyObject (或实现INotifyPropertyChanged对象实例)参与,绑定基础结构无法通知更新。

如果这个值没有改变,只需将绑定消除并直接在Text属性中使用x:Static 。 定义下面的app是VersionManager类的名称空间(和程序集)位置。

 <TextBox Text="{x:Static app:VersionManager.FilterString}" /> 

如果值改变,我build议创build一个单例来包含值并绑定到那个。

单例的例子:

 public class VersionManager : DependencyObject { public static readonly DependencyProperty FilterStringProperty = DependencyProperty.Register( "FilterString", typeof( string ), typeof( VersionManager ), new UIPropertyMetadata( "no version!" ) ); public string FilterString { get { return (string) GetValue( FilterStringProperty ); } set { SetValue( FilterStringProperty, value ); } } public static VersionManager Instance { get; private set; } static VersionManager() { Instance = new VersionManager(); } } 
 <TextBox Text="{Binding Source={x:Static local:VersionManager.Instance}, Path=FilterString}"/> 

在.NET 4.5中可以绑定到静态属性, 阅读更多

您可以使用静态属性作为数据绑定的来源。 如果引发静态事件,则数据绑定引擎会识别该属性的值何时更改。 例如,如果SomeClass类定义了一个名为MyProperty的静态属性,那么SomeClass可以定义一个静态事件,当MyProperty的值发生变化时引发。 静态事件可以使用以下签名之一:

 public static event EventHandler MyPropertyChanged; public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 

请注意,在第一种情况下,该类将公开名为PropertyNameChanged的静态事件,该事件将EventArgs传递给事件处理程序。 在第二种情况下,该类公开一个名为StaticPropertyChanged的静态事件,该事件将PropertyChangedEventArgs传递给事件处理程序。 实现静态属性的类可以select使用任一方法来引发属性更改通知。

您可以使用ObjectDataProvider类和它的MethodName属性。 它可以看起来像这样:

 <Window.Resources> <ObjectDataProvider x:Key="versionManager" ObjectType="{x:Type VersionManager}" MethodName="get_FilterString"></ObjectDataProvider> </Window.Resources> 

声明的对象数据提供者可以像这样使用:

 <TextBox Text="{Binding Source={StaticResource versionManager}}" /> 

如果你使用本地资源,你可以参考如下:

 <TextBlock Text="{Binding Source={x:Static prop:Resources.PerUnitOfMeasure}}" TextWrapping="Wrap" TextAlignment="Center"/> 

可能有两种方法/语法来绑定static属性。 如果p是类MainWindowstatic属性,那么对于textbox binding将是:

1。

 <TextBox Text="{x:Static local:MainWindow.p}" /> 

2。

 <TextBox Text="{Binding Source={x:Static local:MainWindow.p},Mode=OneTime}" /> 

看看我的项目CalcBinding ,它提供给你在Path属性值中编写复杂expression式,包括静态属性,源属性,Math等。 所以,你可以这样写:

 <TextBox Text="{c:Binding local:VersionManager.FilterString}"/> 

祝你好运!