c# - 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 更改一起使用。当IsCameraChecked为true时,我想始终从第 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));
解决方案
我很高兴,你自己找到了,你必须与之合作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();
}
推荐阅读
- python - 如何添加不同的延迟?
- javascript - 如何将动态数据推送到 AM Charts 4 数据属性
- webpack - Webpack 外部可选模块
- applescript - 如果 Google Chrome 或 Microsoft Edge 不存在标签 2,如何打开它?
- editor - 如何禁用在嚎叫编辑器中显示的文件名?
- opengl - 立方体没有出现在OpenGL中
- r - Stargazer:标准错误和置信区间的自定义参数覆盖首先报告的内容
- vba - VBA中的变量样式
- reactjs - Kubernetes 中的 Dockerfile 入口点未执行
- sql-server - 如何迭代不同长度的字符串,用它们的全文替换不同的缩写。用分号分隔的所有缩写