更新静态属性的绑定

时间:2011-06-17 19:22:55

标签: wpf binding static

该应用程序是使用C#和WPF开发的。 我有一个数据绑定到非静态类的静态属性。 启动应用程序时,绑定运行良好,但如果我更改了绑定的bool,则视图未更新。 如何更新此静态属性的绑定? NotifyChanged-Events不受影响。

班级:

public class ViewTemplateManager : NotifyBase
{
    public static bool CanResizeColumns { get; set; }

    static ViewTemplateManager()
    {
        CanResizeColumns = true;
    }

观点:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static Member=viewManager:ViewTemplateManager.CanResizeColumns}}"

4 个答案:

答案 0 :(得分:6)

执行此操作的唯一方法是,如果您引用了关联的BindingExpression

假设您在代码中引用了Thumb,它将如下所示:

var bindingExpression = thumb.GetBindingExpression(Thumb.IsEnabledProperty);
if (bindingExpression != null)
    bindingExpression.UpdateTarget();

你最好的选择是使用单身模式,如下:

public class ViewTemplateManager : NotifyBase
{
    public bool CanResizeColumns { get; set; }

    public static ViewTemplateManager Instance { get; private set; }

    static ViewTemplateManager()
    {
        Instance = new ViewTemplateManager();
    }

    private ViewTemplateManager()
    {
        CanResizeColumns = true;
    }
}

然后像这样绑定:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static viewManager:ViewTemplateManager.Instance}, Path=CanResizeColumns}}"

然后,您只需在更改CanResizeColumns时引发INotifyPropertyChanged.PropertyChanged事件。

答案 1 :(得分:2)

不幸的是,对于静态属性,没有直接等同于INotifyPropertyChanged的通知机制。

有几个选项,包括:

  1. 创建一个返回静态成员的实例级属性。使用自定义机制通知更改实例,此时实例可以引发PropertyChanged事件。如果你不小心取消订阅或使用弱事件模式,这可能会变得丑陋并引入内存泄漏。
  2. 将静态属性移动到单个实例中,并将其作为实例成员放在单例实例上。这允许该实例正常引发PropertyChanged个事件。

答案 2 :(得分:2)

您可以使用属性不是静态的Singleton来实现属性,也可以将其设置为非静态属性,但您只需在App实例中创建一个实例(i会与后者一起)。在任何一种情况下,您都可以再次实施INotifyPropertyChanged

答案 3 :(得分:0)

我认为这是更容易的解决方案:

类属性:

private static bool isEnabled; //there is Your static

public bool IsEnabled
{
    get { return isEnabled; }
    set
    {
        isEnabled = value;
        RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something
    }
}

XAML:

<Button IsEnabled="{Binding IsEnabled}"/>