2014-02-17 3 views
1

В моем UserControl У меня есть CheckboxWPF Checkbox Event & Binding не работает

  <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 в привязке, но не имели успеха.

Почему это Странная проблема с Checkbox ....

ответ

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, - это просто удобство для вас, а базовая структура не вызывает его setter или getter при обновлении значения DP. Затем, не уверен, почему вы вызываете NotifyPropertyChanged("ShowLegends"); на DP. Если мое предположение является правильным и что на самом деле соответствует измененной реализации 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 собственности. как только вы дошли до этого этапа, добавьте остальную часть своей логики шаг за шагом и подтвердите, все ли работает, и если это не так, это приводит к тому, что вы добавляете ее, а не поведение системы.

Update:

Download Link to sample

Прикрепленный образец должен показать три подхода. Event based, Simple Binding, Complex Binding, связанный с DP из пользовательского элемента управления, чтобы затем переключать видимость этого элемента управления.

+0

Viv, Спасибо за событие UnChecked. REG Binding, я могу видеть строку Debug только один раз, после этого, насколько я изменяю состояние, строка Debug не приходит - поэтому ее не запускают/не вызывают. – Tvd

+0

@Tvd Связывание отлично подходит для меня. Я отредактировал ответ и приложил образец, который вы можете скачать и попробовать. Как я уже упоминал в ответе. Прилагаемый пример показывает три подхода. Событие, простая привязка, а также сложная привязка, где ischecked привязан к DP настраиваемого элемента управления, который затем переключает видимость этого элемента управления. Все три подхода работают отлично и все время. испытал это, чтобы быть уверенным. – Viv

Смежные вопросы