2014-02-17 56 views
1

在我的用戶我有一個複選框WPF複選框事件與綁定的工作不

  <CheckBox DockPanel.Dock="Left" VerticalAlignment="Bottom" VerticalContentAlignment="Bottom" x:Name="showLegendsChk" Margin="10,0,0,0" 
        Content="View Legends" Checked="showLegendsChk_Checked" /> 
     <!--IsChecked="{Binding ElementName=CrossSecViewWnd, Path=ShowLegends, Mode=TwoWay}" --> 

我試圖添加數據綁定到它,&增加一些邏輯檢查&非檢查;所以不需要添加事件到相同的。

private bool showLegendsWnd; 
    public CrossSectionalViewControl() { 
     FillLegends(); 
     ShowLegends = false; 
    } 

     // Using a DependencyProperty as the backing store for 
    //IsCheckBoxChecked. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ShowLegendsProperty = 
     DependencyProperty.Register("ShowLegends", typeof(bool), 
     typeof(CrossSectionalViewControl), new UIPropertyMetadata(false)); 

    public bool ShowLegends 
    { 
     get { return showLegendsWnd; } 
     set 
     { 
      showLegendsWnd = value; 
      NotifyPropertyChanged("ShowLegends"); 
      if (showLegendsWnd == true) 
       legendWrap.Visibility = System.Windows.Visibility.Visible; 
      else 
       legendWrap.Visibility = System.Windows.Visibility.Hidden; 

      Console.WriteLine("Show Legends = " + showLegendsWnd + " Chk Value = " + showLegendsChk.IsChecked); 

     } 
    } 

嘗試了很多機智綁定,但沒有成功。最後添加了檢查事件&評論綁定屬性。 -

private void showLegendsChk_Checked(object sender, RoutedEventArgs e) 
    { 
      showLegendsWnd = (bool)showLegendsChk.IsChecked; 
      Console.WriteLine("CHK Show Legends = " + showLegendsWnd + " Chk Value = " + showLegendsChk.IsChecked); 

      if (showLegendsWnd == true) 
       legendWrap.Visibility = System.Windows.Visibility.Visible; 
      else 
       legendWrap.Visibility = System.Windows.Visibility.Hidden; 

      legendWrap.UpdateLayout(); 
    } 

有了這個此外,即使當複選框選中此項,則不會觸發事件,也不與財產檢查都選中&。 在兩個 - 綁定&事件1狀態事件被正確觸發,但另一個不是!還添加了TwoWay模式,嘗試使用UpdateSourceTrigger進行綁定但未成功。

爲什麼這個奇怪的問題複選框....

回答

2

爲您的活動:

您還需要訂閱Unchecked事件。

您的XAML更改爲:

<CheckBox x:Name="showLegendsChk" 
      DockPanel.Dock="Left" 
      VerticalAlignment="Bottom" 
      VerticalContentAlignment="Bottom"    
      Margin="10,0,0,0" 
      Content="View Legends" 
      Checked="showLegendsChk_Checked" 
      Unchecked="showLegendsChk_Checked" /> 

現在,這兩個事件將火一樣的處理程序,如果你在你的處理器設置一個斷點,你可以看到它被調用。

爲您結合

不太清楚你用它嘗試。首先,你爲你的DP定義的屬性對你來說只是一個方便,而底層框架在更新DP值時不會調用它的setter或getter。接下來,不知道你爲什麼要在DP上撥打NotifyPropertyChanged("ShowLegends");。如果我的假設是正確的,並且實際上與INPC提高財產更改實施相對應,則不需要DP的

從嘗試簡單的東西開始。喜歡的東西:

<CheckBox x:Name="chkBox" 
      IsChecked="{Binding IsChecked}" /> 

,並在您DataContext類都有相應的屬性

private bool _isChecked; 
public bool IsChecked { 
    get { return _isChecked; } 
    set { 
    _isChecked = value; 
    Debug.WriteLine(string.Format("Checkbox check state changed to: {0}", _isChecked ? "Checked" : "Not Checked")); 
    } 
} 

您應該看到Debug.WriteLine被調用上更改IsChecked財產。一旦你進入了這個階段,就一步一步地添加剩下的邏輯,並驗證它是否仍然有效,如果沒有,那麼它就是你增加的東西,而不是系統的行爲。

更新:

Download Link to sample

附樣品應顯示三種方法。基於事件的簡單綁定複雜綁定從自定義控件連接到DP然後切換控件的可見性。

+0

Viv,感謝UnChecked事件。 REg綁定,我可以看到調試行只有一次,之後,我改變了多少狀態,調試行不來 - 所以它沒有被解僱/被調用。 – Tvd

+0

@Tvd綁定對我來說工作正常。我編輯了答案並附上了一個可以下載並嘗試的示例。就像我在答案中提到的那樣。所附樣本顯示了三種方法。基於事件的,簡單的綁定,也是一個複雜的綁定,其中的缺血點綁定到自定義控件的DP,然後切換該控件的可見性。所有三種方法都可以正常工作。已經測試它是肯定的。 – Viv