【问题标题】:OnPropertyChange issueOnPropertyChange 问题
【发布时间】:2018-11-20 11:56:19
【问题描述】:

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

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

我以这种方式通过 3 个用户控件从复选框传递值:

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 调用/ckeck 布尔值 IsCamerChecked,一切正常,它会准确地为我提供复选框的值(真或假)

现在的问题是我无法让它与 OnProperty 更改一起使用。 当 IsCameraCheckedtrue 时,我想始终从第 3 个 UserControl 调用方法。

这是我在最后 3 个用户控件中所做的:

 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# wpf data-binding


    【解决方案1】:

    我很高兴,您自己发现,您必须与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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多