C# 手动设置属性时,Singleton属性绑定未更新

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

我有一个名为AppContext的单例对象,它实现了INotifyPropertyChanged,其中包含一个IsLoged属性

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>