【问题标题】:Binding Window.IsEnabled to static bool property将 Window.IsEnabled 绑定到静态布尔属性
【发布时间】:2015-06-24 16:21:45
【问题描述】:

我的 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 标志没有设置,所以当Initialize() 时窗口被启用完成了。

如何做到这一点?

尝试使用此 XAML:

IsEnabled="{Binding App.IsInitialized, Mode=TwoWay}"

【问题讨论】:

  • 绑定完全不知道App是什么。您必须为定义您的应用程序的名称空间定义一个 xml 名称空间 (xmlns),然后您必须在绑定中使用此名称空间为应用程序添加前缀,以便绑定可以识别应用程序的位置,最后您必须实现INotifyPropertyChanged 以便当您更新 IsInitialized 时 Binding 能够看到。你有很多东西要学。
  • @Will 我只要求例如实施 INotifyPropertyChanged,这里没有什么可学的,只有示例。

标签: c# wpf xaml binding static


【解决方案1】:

您可以使用:

IsEnabled="{Binding Source={x:Static Application.Current}, Path=Initialized}"

您还应该通知 Initialized 属性何时更新以便更新 UI,为此您应该实现 INotifyPropertyChanged 接口并在 Initialize() 方法上引发 PropertyChange 事件。

这有帮助。

【讨论】:

    【解决方案2】:

    取自(和修改)documentation 中的 MS 示例:

    <Binding Source="{x:Static Application.Current}" Path="Initialized"/>
    

    【讨论】:

    • 好吧,我想我误解了你的问题。关于真正的问题,我看不出为什么 IsInitialized 属性必须是静态的——App 无论如何都是单例的,您可以通过 Current 静态属性访问它。一旦你使 IsInitialized 实例属性实现属性更改通知变得容易。
    【解决方案3】:

    是的,在大多数情况下,静态是不正确的,所以我要实现 INotifyPropertyChanged,这样 UI 将接收来自我的“控制器”类的更新通知。

    另外,这是未来的精彩代码:https://gist.github.com/schuster-rainer/2644730

    这是 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}">
    

    【讨论】:

    • “未来的精彩代码”与这个问题和答案几乎无关。您要求不同的基本绑定,不需要DynamicBindingProxy
    • 此外,INotifyPropertyChanged 的​​这种实现也存在缺陷。您在 if( propch != null)propch(this,arg) 调用之间有一个经典且众所周知的竞争条件,更不用说它甚至不检查 value 是否真的与 m_bInit 不同。
    • 感谢热心建议
    • see here for some good examples,但要小心,因为它们大多包含一些你可能不需要或一开始感觉不舒服的额外口味。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2011-08-26
    • 2016-09-26
    • 1970-01-01
    • 2014-09-10
    • 2012-01-21
    相关资源
    最近更新 更多