C# 手动设置属性时,Singleton属性绑定未更新
我有一个名为AppContext的单例对象,它实现了INotifyPropertyChanged,其中包含一个IsLoged属性C# 手动设置属性时,Singleton属性绑定未更新,c#,wpf,binding,singleton,C#,Wpf,Binding,Singleton,我有一个名为AppContext的单例对象,它实现了INotifyPropertyChanged,其中包含一个IsLoged属性 public class AppContext : INotifyPropertyChanged { private static AppContext instance; public AppContext() { } public static AppContext Instance { get => insta
public class AppContext : INotifyPropertyChanged {
private static AppContext instance;
public AppContext() { }
public static AppContext Instance {
get => instance ?? (instance = new AppContext());
}
static bool _isLogged = true;
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public bool IsLogged {
get => _isLogged;
set {
_isLogged = value;
Console.WriteLine("islogged = {0}", value);
OnPropertyChanged();
}
}
}
我在应用程序中存储StaticResource。引用App.xaml文件中AppContext的资源:
我的问题是:
当我在两个窗口中的一个窗口上选中/取消选中复选框时,效果很好,两个复选框保持相同的状态
但是,如果我添加一个按钮,单击该按钮可以更改IsLogged的状态,则复选框不会更新
private void Button_Click(object sender, RoutedEventArgs e) {
AppContext.Instance.IsLogged = !AppContext.Instance.IsLogged;
}
问题是我的属性实例正在创建与我的App.xaml文件中的StaticResource不同的实例 我最终将此添加到App.xaml.cs: 现在我用这个按钮:
App.Context.IsLogged = !App.Context.IsLogged;
因此,只有一个实例
但如果您有更好的方法,我很感兴趣:诊断
问题的根源在于AppContext类不是一个真正的单例类——它有一个公共构造函数,允许创建任意数量的实例。而这正是发生的事情-此代码:
<Application.Resources>
<local:AppContext x:Key="AppContext"/>
</Application.Resources>
或者,如果要保留绑定并将单例作为资源,则应修改AppContext资源以引用AppContext.Instance属性:
<Application.Resources>
<x:Static x:Key="AppContext" MemberType="{x:Type local:AppContext}" Member="Instance" />
</Application.Resources>
另外,虽然没有必要修复此问题,但我建议将AppContext构造函数设置为私有,这样您就可以遵循单例模式,并且不会意外地创建新实例。非常感谢您,这正是我想要的!我犯了一个错误。我把这句话改了。现在它完全工作了,谢谢!真奇怪。您是否愿意分享有关此错误的一些详细信息以及您使用的框架版本?我现在要去上学,您介意我稍后再做吗?只要适合您。
App.Context.IsLogged = !App.Context.IsLogged;
<Application.Resources>
<local:AppContext x:Key="AppContext"/>
</Application.Resources>
<CheckBox IsChecked="{Binding Source={x:Static local:AppContext.Instance}, Path=IsLogged}"/>
<Application.Resources>
<x:Static x:Key="AppContext" MemberType="{x:Type local:AppContext}" Member="Instance" />
</Application.Resources>