C# 绑定Window.IsEnabled到静态bool属性

C# 绑定Window.IsEnabled到静态bool属性,c#,wpf,xaml,binding,static,C#,Wpf,Xaml,Binding,Static,我的WPF项目中有以下App.xaml.cs代码: public partial class App : Application { public static bool IsInitialized { get; private set; } public static async Task Initialize() { // Mark application as initialized

我的WPF项目中有以下
App.xaml.cs
代码:

public partial class App : Application
{
    public static bool IsInitialized
    {
        get;
        private set;
    }

    public static async Task Initialize()
    {
        // Mark application as initialized
        IsInitialized = true;
    }
}
我的应用程序的主窗口应该被禁用(
IsEnabled
==False
),而
App.IsInitialized
标志没有设置,所以当
初始化()
完成时窗口被启用

如何做到这一点

尝试使用此XAML:

IsEnabled="{Binding App.IsInitialized, Mode=TwoWay}"
摘自(并修改)中的MS示例:


您可以使用:

IsEnabled="{Binding Source={x:Static Application.Current}, Path=Initialized}"
此外,还应在初始化的属性更新时发出通知,以便更新UI,为此,应实现INotifyPropertyChanged接口,并在Initialize()方法上引发PropertyChange事件


跳这一步很有帮助。

是的,静态在大多数情况下是不正确的,因此我将实现INotifyPropertyChanged,以便UI将从我的“控制器”类接收更新通知

此外,这是未来的精彩代码:

这是INotifyPropertyChanged实现示例

public class AppController : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private bool m_bInit;
        private PropertyChangedEventArgs m_bInitEA = new PropertyChangedEventArgs("IsInitialized");
        public bool IsInitialized
        {
            get { return m_bInit; }
            set
            {
                m_bInit = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, m_bInitEA);
            }
        }
    }
这是XAML:

<Window x:Class=".......
        Loaded="OnLoaded" DataContext="{x:Static Application.Current}"
        IsEnabled="{Binding Controller.IsInitialized}">

绑定完全不知道什么是
App
。您必须为定义应用程序的命名空间定义一个xml命名空间(xmlns),然后必须在绑定中为应用程序加上此命名空间的前缀,以便绑定可以标识应用程序的位置,最后必须实现INotifyPropertyChanged,以便绑定能够在更新初始化时看到。“你有很多东西要学!”我只想问你一个例子,弹劾INotifyPropertyChanged,这里没有什么要学的,只有一个例子。我想我误解了你的问题。关于真正的问题,我不明白为什么iInitialized属性必须是静态的-应用程序无论如何都是一个单例,您可以通过当前的静态属性访问它。一旦您初始化了一个实例属性,实现属性更改通知就变得很容易了。“未来的精彩代码”与这个问题和答案基本无关。您要求不同的基本绑定,不需要使用
DynamicBindingProxy
。此外,INotifyPropertyChanged的此实现存在缺陷。在
if(propch!=null)
propch(this,arg)
调用之间有一个经典且众所周知的竞态条件,更不用说它甚至没有检查
值是否真的与
m_bInit
不同。谢谢大家的建议,但要小心,因为它们大多含有一些额外的口味,你可能不需要或一开始就觉得舒服。
<Window x:Class=".......
        Loaded="OnLoaded" DataContext="{x:Static Application.Current}"
        IsEnabled="{Binding Controller.IsInitialized}">