C# 绑定Window.IsEnabled到静态bool属性
我的WPF项目中有以下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
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}">