绑定到静态属性不响应PropertyChanged

时间:2015-05-09 10:07:14

标签: c# wpf xaml data-binding

我对XAML和WPF相当新,并且已经阅读了大量关于绑定控件属性的示例,但似乎没有适用于我的问题。

我有一个静态类Analyze,它继承了INotifyPropertyChanged

以下代码摘要

class Analyse : INotifyPropertyChanged
{
    public static DataSet moodleData;  // Dataset containing the log data for analysis
    private static bool dataPresent = true;

    public static Boolean DataPresent
    {
        get { return dataPresent; }
        set
        {
            if (dataPresent != value)
            {
                dataPresent = value;
                NotifyStaticPropertyChanged("DataPresent");
            }
        }
    }

    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged
     = delegate { };

    private static void NotifyStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
    }


    #endregion

    public static void clearData()
    {
        try
        {
            moodleData.Clear();
            DataPresent = false;
        }
        catch { }
    }
}

我的XAML包含名称空间local

<Window x:Name="TheMainWindow" x:Class="MoodleLogAnalyse.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}"

    xmlns:local="clr-namespace:MoodleLogAnalyse"

    Title="MainWindow" Height="556.88" Width="793" WindowStartupLocation="CenterScreen">

按钮绑定正确

<Button Name="OpenButton" Command="Open" 
       IsEnabled="{Binding Source={x:Static local:Analyse.DataPresent},
       Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"  
       Content="Open Grades" />

该属性肯定绑定到IsEnabled,在代码中手动更改dataPresent定义启用和禁用按钮但动态更改(如在true和false之间切换,如调用clear data方法)不会更改IsEnabled状态按钮在运行时。

属性更改事件正在触发,因为我已插入断点进行检查。

我看不出我的错在哪里!任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

Source属性用于存储将用作备用绑定源的对象(默认情况下,绑定使用DataContext)。

<Button IsEnabled="{Binding Source={x:Static local:Analyze.DataPresent}}" />

因此,当您使用上面的代码时,Static扩展名提供DataPresent属性的当前值,该值存储在Source属性中。在这种情况下,绑定使用盒装常量值(truefalse)作为源。

<Button IsEnabled="{Binding Path=(local:Analyze.DataPresent)}" />

但是当您指定Path属性时,绑定会定位您的静态类并绑定到该属性。在这种情况下,静态DataPresent属性是源,StaticPropertyChanged事件用于通知绑定有关更新。

在绑定到静态属性的情况下不能使用INotifyPropertyChanged,因为没有实例用于访问该属性。必须使用相应的静态事件。

事件的名称必须等于StaticPropertyChanged,其类型必须为EventHandler<PropertyChangedEventArgs>。或者名称必须由两部分组成:属性名称和后缀Changed。在最后一种情况下,事件的类型必须是EventHandler,因为该事件仅通知相应属性的更改。

这意味着:

  1. 课程Analyze可以是静态的,因为INotifyPropertyChanged是不必要的。
  2. 事件StaticPropertyChanged可以重命名为DataPresentChanged,其类型可以更改为EventHandler
  3. 换句话说:

    public static class Analyze
    {
        public static DataSet moodleData;  // Dataset containing the log data for analysis
        private static bool dataPresent = true;
    
        public static Boolean DataPresent
        {
            get { return dataPresent; }
            set
            {
                if (dataPresent != value)
                {
                    dataPresent = value;
                    DataPresentChanged(null, EventArgs.Empty);
                }
            }
        }
    
        public static event EventHandler DataPresentChanged = delegate { };
    }
    

    有用的链接:

    1. Binding.Source Property
    2. Binding to static properties