该应用程序是使用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}}"
答案 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
的通知机制。
有几个选项,包括:
PropertyChanged
事件。如果你不小心取消订阅或使用弱事件模式,这可能会变得丑陋并引入内存泄漏。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}"/>