绑定到静态 属性 不响应 PropertyChanged

Binding to a static property is not responding to PropertyChanged

我对 XAML 和 WPF 还很陌生,已经阅读了很多关于如何绑定控件属性的示例,但 none 似乎适用于我的问题。

我有一个继承 INotifyPropertyChanged

的静态 class 分析

下面的代码摘要

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 包含名称 space 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之间切换,如调用清除数据方法不会在 运行 时间更改按钮的 IsEnabled 状态。

属性 更改事件正在触发,因为我插入了要检查的断点。

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

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

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

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

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

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

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

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

的更改

这意味着:

  1. class Analyze 可以是静态的,因为 INotifyPropertyChanged 不是必需的。
  2. 事件 StaticPropertyChanged 可以重命名为 DataPresentChanged,其类型可以更改为 EventHandler

换句话说:

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