我再次需要您的帮助。 我有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));
答案 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();
}