从调用属性更改回调的方法设置依赖项属性

时间:2012-06-28 20:17:44

标签: wpf dependency-properties

我的WPF控件有一个奇怪的问题。基本上我有一个控件,在我的主要内容面前呈现模态内容。我的控件是对here所示答案的修改。

我有一个名为Bool的{​​{1}}依赖项属性,用于隐藏/显示模态内容。该属性定义如下:

IsShown

它有一个标准的.Net属性包装器,如下所示:

public static readonly DependencyProperty IsShownProperty =
    = DependencyProperty.Register("IsShown",
    typeof(bool), 
    typeof(ModalContentControl), 
    new UIPropertyMetadata(false, IsShownChangedCallback));

属性已更改回调如下所示:

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属性绑定到我的viewModel。我可以按一个按钮,该按钮调用一个命令来更改绑定到我的控件的IsShown属性的布尔属性。模态内容按预期显示和隐藏。

我的问题来自于IsShownShowModalContent方法是公共的,因此可以从代码中调用它们。我希望能够做的是调用HideModalContent,例如,当我查询ShowModalContent属性时,它应该报告正确的值(在这种情况下为真)E.G。如果我使用常规属性,我将有一个IsShown类型的支持字段,该字段将在方法中更新。然后,属性get语句将返回此字段。

但是因为我的属性是依赖属性,所以我无法访问支持字段。我可以从方法更新值的唯一方法是通过.net包装器设置依赖项属性,但这会阻止我的控件工作(一旦显示内容我再也无法将其删除)。

我认为这种行为可能是由于在方法中设置Bool属性引起的,该属性调用属性更改回调,该属性设置调用的IsShown属性..但我记得在某处看过WPF防止这种情况。

那么如何解决这个问题,以便我的布尔依赖属性报告正确的值?

1 个答案:

答案 0 :(得分:0)

通过一点点思考(和一些运气),我设法弄清楚问题是什么。我需要改变两件事才能让它发挥作用。

第一个问题是ShowModalContentHideModalContent方法做了两件事。

  1. 设置IsShown属性。
  2. 更新控件的状态。
  3. 这是一个问题,因为更改IsShown属性会调用调用IsChangedCallbackShowModalContent方法的HideModalContent,后者会更改IsShown属性。我认为WPF会阻止无限循环,但即使尝试通过缓存值来在代码中管理它也是一个令人头疼的问题。

    当我意识到公共方法应该做的 only 事情是设置属性时,我的灵感来了。我的公共方法现在看起来像这样:

    public void ShowModalContent()
    {
        IsShown = true;
    }
    
    public void HideModalContent()
    {
        IsShown = false;
    }
    

    然后触发属性更改回调,更新控件的状态。

    我的第二个灵感时刻是当我意识到我的ViewModel没有准确反映IsShown属性的状态时,这是由于显然默认依赖属性绑定模式为{{1 }}。我只是将我的OneWay定义绑定模式更新为DependencyProperty,现在一切正常。

    BindsTwoWayByDefault