我的 WPF 控件有一个奇怪的问题。基本上我有一个控件,它在我的主要内容前面呈现模态内容。我的控制是对此处显示的答案的修改。
我有一个Bool
名为的依赖属性IsShown
,用于隐藏/显示模式内容。属性定义如下:
public static readonly DependencyProperty IsShownProperty =
= DependencyProperty.Register("IsShown",
typeof(bool),
typeof(ModalContentControl),
new UIPropertyMetadata(false, IsShownChangedCallback));
它有一个标准的 .Net 属性包装器,如下所示:
public bool IsShown
{
get { return (bool)GetValue(IsShownProperty); }
set { SetValue(IsShownProperty, value); }
}
属性更改回调如下所示:
private static void IsShownChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ModalContentControl control = (ModalContentControl)d;
if ((bool)e.NewValue == true)
{
control.ShowModalContent();
}
else
{
control.HideModalContent();
}
}
ShowModalContent
和HideModalContent
方法分别包含显示和隐藏模态内容的逻辑。
我的窗口中有这个控件,并且该IsShown
属性绑定到我的 viewModel。我可以按下一个按钮,该按钮调用一个命令,该命令更改绑定到IsShown
我的控件属性的布尔属性。模态内容按预期显示和隐藏。
我的问题来自ShowModalContent
andHideModalContent
方法是公共的,因此可以从代码中调用它们。例如,我想要做的是 call ShowModalContent
,当我查询IsShown
属性时,它应该报告正确的值(在这种情况下为真) EG 如果我使用的是常规属性,我将有一个类型的支持Bool
字段在方法中进行更新。然后该字段将由属性 get 语句返回。
但是因为我的属性是依赖属性,所以我无权访问支持字段。我可以从该方法更新值的唯一方法是通过 .net 包装器设置依赖属性,但这会阻止我的控件工作(一旦显示内容,我就无法再次摆脱它)。
我认为这种行为可能是由于在方法中设置IsShown
属性引起的,该方法调用了属性更改回调,该回调设置了IsShown
调用的属性。但我记得在某处读过 WPF 可以防止这种情况。
那么如何解决这个问题,以便我的布尔依赖属性报告正确的值呢?