2013-03-18 81 views
25

在WPF數據綁定中,我可以將IsChecked屬性綁定到某些數據,例如,用戶設置,但我需要處理「CheckChanged」事件,我知道我能應付seperately 經過未選中事件,但有什麼辦法,當該值更改爲得到通知?WPF複選框:檢查更改的處理

<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive, 
      Source={x:Static Properties:Settings.Default}}" /> 

注意:我不關心它是否被選中或未選中。我只是想在它發生變化時得到通知。

+1

你想要什麼?你爲什麼不將'IsChecked'屬性綁定到ViewModel中的某些內容並對該屬性做出反應? UI不是數據。 – 2013-03-18 15:20:52

+0

它已經綁定到用戶設置。 UI不是數據,這與提出的問題有關嗎? – David 2013-03-18 15:22:24

+2

我的觀點是,如果ViewModel在更改時需要知道,則應該將其綁定到ViewModel,而不是靜態的,然後從VM內部可以更改靜態值。 – 2013-03-18 15:26:00

回答

0

那麼Checked事件呢?將其與AttachedCommandBehaviors或類似的東西結合起來,並在每次調用該事件時在您的視圖模型中獲取一個觸發函數DelegateCommand

+0

正如在問題中所評論的,我不想使用Checked /未經檢查的事件處理程序,我關心的是「已更改」信號。 – David 2013-03-18 15:24:33

8

林把這個在回答中,因爲它是一個評論太長:

如果你需要的虛擬機時的CheckBox改變要知道,你真的應該綁定CheckBox到虛擬機,而不是靜態的值:

public class ViewModel 
{ 
    private bool _caseSensitive; 
    public bool CaseSensitive 
    { 
     get { return _caseSensitive; } 
     set 
     { 
      _caseSensitive = value; 
      NotifyPropertyChange(() => CaseSensitive); 

      Settings.Default.bSearchCaseSensitive = value; 
     } 
    } 
} 

XAML:

<CheckBox Content="Case Sensitive" IsChecked="{Binding CaseSensitive}"/> 
+1

@HighScore,謝謝,這是一個解決方案,但對我的情況矯枉過正。我不想訴諸INotifyPropertyChanged,它太麻煩了。 :) – David 2013-03-18 15:35:38

+2

@大衛什麼?你如何處理沒有INotifyPropertyChanged的WPF雙向綁定?此外,這與示例無關,只是因爲它是ViewModel屬性。我的例子工作得很好,如果你刪除它。 – 2013-03-18 15:37:12

+1

確實如此,這是雙向綁定。該設置可以被讀取和寫入,遺憾的是我沒有通知設置者改變。 – David 2013-03-18 15:54:44

61

那你可以^h並且選中和未選中的事件分別並不意味着你要必須。如果你不想遵循MVVM模式,你可以簡單地附上相同的處理這兩個事件,你有你的改變信號:

<CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/> 

,並在代碼隱藏;

private void CheckBoxChanged(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("Eureka, it changed!"); 
} 

請注意,WPF大力鼓勵利用INotifyPropertyChanged的和/或DependencyProperties的一個原因MVVM模式。這是有用的,不是我想鼓勵的良好編程習慣。

4

我知道這是一個老問題,但如果使用MVVM綁定到Command怎麼樣?

例如:

<CheckBox Content="Case Sensitive" Command="{Binding bSearchCaseSensitive}"/> 

對於我來說,觸發雙方CheckUncheck

5

爲複選框點擊=複選框更改以下也將工作:

<CheckBox Click="CheckboxClicked" /> 
Private Sub CheckboxClicked(sender As Object, e As System.Windows.RoutedEventArgs) 
    '.... do some stuff 
End Sub 

它工作的額外優勢,當IsThreeState =「真」,而只是處理經過和未檢查不。

+0

如果複選框被禁用,但是您單擊它,會發生什麼情況?我猜這個事件還在發生,這不是所期望的行爲,大部分時間 – 2017-05-12 08:36:27

+0

這不應該發生。如果它被禁用,點擊事件也將被禁用。 – Expenzor 2017-07-22 13:48:48