UserControl上绑定依赖属性的问题

Chr*_*col 4 wpf xaml binding dependency-properties

我有两个userControls(IconUserControl和DisplayUserControl),我遇到了绑定依赖项属性的问题,这里有一些细节:

  • IconUserControl有一个IsDisplayShown的bool DP
  • DisplayUserControl具有IsDisplayShown的bool DP

在XAML中我有:

<local:DisplayUserControl
                    x:Name="DisplayUserControl"
                    IsDisplayShown="{Binding ElementName=IconUserControl, Path=IsDisplayShown, Converter={StaticResource DummyConverter}}" />

<local:IconUserControl
                    x:Name="IconUserControl" />
Run Code Online (Sandbox Code Playgroud)

当IconUserControl.IsDisplayShown设置为true时,我可以在DummyConverter中看到这个值被传递,但它从不设置DisplayUserControl.IsDisplayShown.

但是,如果在View I设置的代码隐藏中DisplayUserControl.IsDisplayShown = true;,那么它可以正常工作.

我有两个UserControls的DataContext在构造函数中设置为"this".我试图摆弄绑定的"模式"属性.

*注意:DummyConverter只返回值,我只有这个确认Binding正在尝试工作.

我究竟做错了什么?

编辑:

这是两个DP:

public bool IsDisplayShown
        {
            get { return (bool)GetValue(IsDisplayShownProperty); }
            set { SetValue(IsDisplayShownProperty, value); }
        }
        public static readonly DependencyProperty IsDisplayShownProperty =
            DependencyProperty.Register("IsDisplayShown", typeof(bool), typeof(IconUserControl), new UIPropertyMetadata(false));

public bool IsDisplayShown
        {
            get { return (bool)GetValue(IsDisplayShownProperty); }
            set
            {
                if (value)
                    ShowOpenItems();
                else
                    HideOpenItems();
                SetValue(IsDisplayShownProperty, value);
            }
        }
        public static readonly DependencyProperty IsDisplayShownProperty=
            DependencyProperty.Register("IsDisplayShown", typeof(bool), typeof(DisplayUserControl), new UIPropertyMetadata(false));
Run Code Online (Sandbox Code Playgroud)

Mua*_*Dib 5

这应该对你有帮助,但可能无法解决整个问题.不过,这是一个很好的起点.添加此代码将导致绑定的调试信息转储到Visual Studio中的"调试"窗口.

将此命名空间添加到您的xaml ....

xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
Run Code Online (Sandbox Code Playgroud)

然后,你的绑定,添加这个:

diagnostics:PresentationTraceSources.TraceLevel=High
Run Code Online (Sandbox Code Playgroud)

查看Bea Stollnitz文章了解更多信息

  • 您不应该在DP包装器中添加任何额外的代码,因为包装器Get和Set不一定在运行时调用. (2认同)