绑定到静态 属性 不响应 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
属性。在这种情况下,绑定使用装箱常量值(true
或 false
)作为源。
<Button IsEnabled="{Binding Path=(local:Analyze.DataPresent)}" />
但是当您指定 Path
属性 时,绑定会定位您的静态 class 并绑定到 属性。在这种情况下,静态 DataPresent
属性 是源,StaticPropertyChanged
事件用于通知绑定更新。
在绑定到静态属性的情况下不能使用INotifyPropertyChanged
,因为没有实例用于访问那个属性。必须改用相应的静态事件。
事件的名称必须等于 StaticPropertyChanged
,其类型必须是 EventHandler<PropertyChangedEventArgs>
。或者名称必须由两部分组成:属性 名称和后缀 Changed
。在最后一种情况下,事件的类型必须是 EventHandler
,因为该事件仅通知相应 属性.
的更改
这意味着:
- class
Analyze
可以是静态的,因为 INotifyPropertyChanged
不是必需的。
- 事件
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 { };
}
有用的链接:
我对 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
属性。在这种情况下,绑定使用装箱常量值(true
或 false
)作为源。
<Button IsEnabled="{Binding Path=(local:Analyze.DataPresent)}" />
但是当您指定 Path
属性 时,绑定会定位您的静态 class 并绑定到 属性。在这种情况下,静态 DataPresent
属性 是源,StaticPropertyChanged
事件用于通知绑定更新。
在绑定到静态属性的情况下不能使用INotifyPropertyChanged
,因为没有实例用于访问那个属性。必须改用相应的静态事件。
事件的名称必须等于 StaticPropertyChanged
,其类型必须是 EventHandler<PropertyChangedEventArgs>
。或者名称必须由两部分组成:属性 名称和后缀 Changed
。在最后一种情况下,事件的类型必须是 EventHandler
,因为该事件仅通知相应 属性.
这意味着:
- class
Analyze
可以是静态的,因为INotifyPropertyChanged
不是必需的。 - 事件
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 { };
}
有用的链接: