2015-05-09 36 views
1

我對XAML和WPF相當新,並閱讀了大量如何綁定控件屬性的例子,但似乎沒有適用於我的問題。綁定到一個靜態屬性沒有響應PropertyChanged

我有一個靜態類分析,它繼承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代碼

摘要包括名字空間當地

<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定義啓用和禁用該按鈕,但動態更改(如在真和假之間切換,如調用清除數據方法不會更改按鈕的IsEnabled狀態在運行時。

屬性更改事件正在觸發,因爲我插入了要檢查的斷點。

我看不到我在哪裏出錯了!任何幫助,將不勝感激。

+0

有趣的評論,但不能幫助解決的問題! –

+0

實際上,自WPF 4.5以來,它應該與StaticPropertyChanged事件一起工作。但是,你的綁定應該是'{Binding Path =(local:Analyse.DataPresent),...}'。 – Clemens

+0

這似乎也沒有必要實施INotifyPropertyChanged。你可以改爲聲明你的類是靜態的:'static class Analyze {...}'。 – Clemens

回答

2

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

換句話說:

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
+0

@Stephen Smith - 您應該將此標記爲您的問題的答案。 – GreenEyedAndy

+0

感謝你們的評論和迴應,他們都非常有幫助和洞察力,希望他們會幫助別人,而不僅僅是我! –