首页 > 解决方案 > OnPropertyChange 问题

问题描述

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

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

我以这种方式将复选框中的值通过 3 UserControls 传递:

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 中,我为第一个用户控件中的复选框执行此操作:

<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 更改一起使用。当IsCameraCheckedtrue时,我想始终从第 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,并且如果该值发生更改,则会发出通知。我希望你明白我的意思。提前致谢 :)

更新找到解决方案:在第三个用户控件中,我将代码更改为:

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));

标签: c#wpfdata-binding

解决方案


我很高兴,你自己找到了,你必须与之合作PropertyChangedCallback。您不应该在 的 setter 或 getter 中使用逻辑DependencyProperty,因为它们只会被后面的代码以编程方式调用,XAML 直接与 SetValue(..) 一起使用。所以你必须PropertyChangedCallback在 3. UserControl 中使用并从 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();
}

推荐阅读