OnPropertyChange问​​题

时间:2018-11-20 11:56:20

标签: c# wpf data-binding

我再次需要您的帮助。 我有3个WPF UserControl。 第二个使用第一个作为模板,第三个使用第二个。

在第一个中,我有一个复选框。 我的目标是每当第一个UserControl中的复选框被选中时,在第3个UserControl中调用一个方法。

我通过以下方式将复选框中的值通过3个UserControl传递:

public bool IsCameraChecked
      {
         get { return (bool)GetValue(IsCameraCheckedProperty); }
         set { SetValue(IsCameraCheckedProperty, value); }          
      }

public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(ReplayController), new PropertyMetadata(false));

,在XAML中,我针对第一个UserControl中的复选框执行了此操作:

<CheckBox x:Name="ckbCamera" Grid.Column="2" Grid.Row="1" Click="ckbActiv_Clicked" Margin="10,8,-10,6" IsChecked="{Binding ElementName=_this,Path=IsCameraChecked, Mode=TwoWay}"/>

对第二个和第三个UserControl重复相同的操作。

到目前为止,如果我从第三个UserControl调用/取消bool IsCamerChecked ,一切都会正常进行,它为我提供了复选框的值(正确或错误)

现在问题出在某种程度上,我无法使其与OnProperty更改一起使用。 当 IsCameraChecked true 时,我想始终从第3个UserControl调用方法。

这是我在上一个第3个UserControl中所做的:

 public bool IsCameraChecked
      {
         get { return (bool)GetValue(IsCameraCheckedProperty); }
         set
         {
            SetValue(IsCameraCheckedProperty, value);
            _isConnected = value;                
            OnPropertyChanged();
         }
      }
      /// <summary>
      /// Called when any property changes.
      /// </summary>
      public event EventHandler PropertyChanged;

      protected void OnPropertyChanged()
      {
         EventHandler handler = PropertyChanged;
         if (handler != null)
            handler(this, EventArgs.Empty);
      }      
public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(TWDebugRecorder), new PropertyMetadata(false));

不幸的是,仅当我直接从任何方法调用 IsCameraChecked 时,才会检查该值 但是我需要的是,当在第一个UserControl中选中chekcbox时,第三个UserControl中的 IsCameraChecked 的值将变为 true ,如果该值发生更改,则会发出通知。 我希望你明白我的意思。 在此先感谢:)

UPDATE找到解决方案: 在第三个UserControl中,我将代码更改为:

public bool IsCameraChecked
      {
         get { return (bool)GetValue(IsCameraCheckedProperty); }
         set
         {
            SetValue(IsCameraCheckedProperty, value);
            _isConnected = value;
         }
      }          

      protected static void OnPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
      {
         TWDebugRecorder temp = source as TWDebugRecorder;

         // here comes my method I wanted to call

      }     

public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(TWDebugRecorder), new PropertyMetadata(false, OnPropertyChanged));

1 个答案:

答案 0 :(得分:0)

很高兴您自己发现了您必须与PropertyChangedCallback一起工作。您不应该在DependencyProperty的setter或getter中使用逻辑,因为它们只会从后面的代码中以编程方式调用,XAML直接与SetValue(..)一起使用。因此,您必须在3. UserControl中使用PropertyChangedCallback并从Property-Setter中移动逻辑:

public static readonly DependencyProperty IsCameraCheckedProperty = DependencyProperty.Register(nameof(IsCameraChecked), typeof(bool), typeof(TWDebugRecorder), new PropertyMetadata(false, CameraCheckedChanged));

private static void CameraCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    _isConnected = value;
    OnPropertyChanged();
}