Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 更新静态属性的绑定_Wpf_Binding_Static - Fatal编程技术网

Wpf 更新静态属性的绑定

Wpf 更新静态属性的绑定,wpf,binding,static,Wpf,Binding,Static,该应用程序是用C#和WPF开发的。 我有一个数据绑定到非静态类的静态属性。 当应用程序启动时,绑定很好,但是如果我更改绑定的bool,视图就不会更新。 如何更新此静态属性的绑定? NotifyChanged事件不受影响 班级: public class ViewTemplateManager : NotifyBase { public static bool CanResizeColumns { get; set; } static ViewTemplateManager()

该应用程序是用C#和WPF开发的。 我有一个数据绑定到非静态类的静态属性。 当应用程序启动时,绑定很好,但是如果我更改绑定的bool,视图就不会更新。 如何更新此静态属性的绑定? NotifyChanged事件不受影响

班级:

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}}"

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

有两种选择,包括:

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

  • 您可以使用属性不是静态的实现属性,或者也可以将其设置为非静态,但您只需在
    应用程序中创建一个实例(例如,我将使用后者)。在这两种情况下,您都可以再次实现
    INotifyPropertyChanged

    唯一的方法是引用关联的

    假设代码中有一个对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}}"
    

    我认为这是一个更简单的解决方案:

    类别属性:

    private static bool isEnabled; //there is Your static
    
    public bool IsEnabled
    {
        get { return isEnabled; }
        set
        {
            isEnabled = value;
            RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something
        }
    }
    
    XAML:

    
    
    我不明白为什么这个类是静态的。您可以使用继承或可组合性将其与viewmodel的基类相结合。如果您这样做,您将在viewmodel上拥有一个可以调整列大小的属性,并成功地使用OnPropertyChanged(“PropertyName”)?在这个答案之后添加了
    StaticPropertyChanged
    @wobbles
    <Button IsEnabled="{Binding IsEnabled}"/>