我对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状态按钮在运行时。
属性更改事件正在触发,因为我已插入断点进行检查。
我看不出我的错在哪里!任何帮助将不胜感激。
答案 0 :(得分:3)
Source
属性用于存储将用作备用绑定源的对象(默认情况下,绑定使用DataContext
)。
<Button IsEnabled="{Binding Source={x:Static local:Analyze.DataPresent}}" />
因此,当您使用上面的代码时,Static
扩展名提供DataPresent
属性的当前值,该值存储在Source
属性中。在这种情况下,绑定使用盒装常量值(true
或false
)作为源。
<Button IsEnabled="{Binding Path=(local:Analyze.DataPresent)}" />
但是当您指定Path
属性时,绑定会定位您的静态类并绑定到该属性。在这种情况下,静态DataPresent
属性是源,StaticPropertyChanged
事件用于通知绑定有关更新。
在绑定到静态属性的情况下不能使用INotifyPropertyChanged
,因为没有实例用于访问该属性。必须使用相应的静态事件。
事件的名称必须等于StaticPropertyChanged
,其类型必须为EventHandler<PropertyChangedEventArgs>
。或者名称必须由两部分组成:属性名称和后缀Changed
。在最后一种情况下,事件的类型必须是EventHandler
,因为该事件仅通知相应属性的更改。
这意味着:
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 { };
}
有用的链接: