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