我有自己的WPF用户控件(例如图像+视图框 - 没关系(。此控件具有布尔依赖属性,例如 NeedToDrawRect。我想要实现的目标:当用户将此属性设置为 true(在 XAML 中(时,我需要执行一些操作 - 但只有一次。我计划在 c-tor 中执行此操作,但似乎我还无法在该阶段看到此属性值:
XAML:
<pzi:PanZoomImage Grid.Row="1" Grid.Column="0" NeedToDrawRect="True" />
用户控件构造函数:
public PanZoomImage()
{
InitializeComponent();
LayoutRoot.DataContext = this;
// Here NeedToDrawRect is still false
if (NeedToDrawRect)
DoSmth();
}
那么,我在哪里可以检查用户在 XAML 中设置的值。当然,我可以覆盖OnRender并每次都在那里检查,但我想使用正确的方法来做到这一点。
为依赖项属性注册一个PropertyChangedCallback
:
public static readonly DependencyProperty NeedToDrawRectProperty = DependencyProperty.Register(nameof(NeedToDrawRect),
typeof(bool), typeof(PanZoomImage ), new PropertyMetadata(new PropertyChangedCallback(OnValueChanged)));
public bool NeedToDrawRect
{
get { return (bool)GetValue(NeedToDrawRectProperty); }
set { SetValue(NeedToDrawRectProperty, value); }
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var ctrl = (PanZoomImage)d;
var newValue = (bool)e.NewValue;
//...
}
每当依赖项属性设置为新值时,都会调用回调。
如果你只想做一次某事,你可以使用私有字段来跟踪之前是否调用过回调,例如:
private int n;
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (n++ > 0)
{
var ctrl = (PanZoomImage)d;
var newValue = (bool)e.NewValue;
//...
}
}
您可以在创建依赖项属性时使用 PropertyChangedCallback。如果你希望它只执行一次,然后不允许用户更改它,你可以尝试在 PropertyChangedCallback 中操作它。
public bool NeedToDrawRect
{
get { return (bool)GetValue(NeedToDrawRectProperty); }
set
{
SetValue(NeedToDrawRectProperty, value);
}
}
public static readonly DependencyProperty NeedToDrawRectProperty =
DependencyProperty.Register("NeedToDrawRect",
typeof(bool),
typeof(PanZoomImage),
new PropertyMetadata(false, OnNeedToDrawRectChanged ));
private static void OnNeedToDrawRectChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as PanZoomImage;
if (control!=null && (bool)e.NewValue == false && (bool)e.OldValue == true)
{
control.NeedToDrawRect = true; // user won't be able to set it to false again.
}
}
这应该有效。如果使用复选框来执行该操作,请将复选框的 IsReadOnly 属性绑定到属性 NeedToDrawRect,以便用户将其设置为 true 后,用户将无法再次更改它。您可能需要一个反向布尔转换器来执行此操作。