【问题标题】:Problem with Binding Dependency Property on a UserControl在 UserControl 上绑定依赖属性的问题
【发布时间】:2011-01-04 08:06:19
【问题描述】:

我有两个用户控件(IconUserControl 和 DisplayUserControl),我在绑定依赖属性时遇到问题,这里有一些细节:

  • IconUserControl 的布尔 DP 为 IsDisplayShown
  • DisplayUserControl 的布尔 DP 为 IsDisplayShown

在 XAML 中我有:

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

<local:IconUserControl
                    x:Name="IconUserControl" />

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

但是,如果在我设置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));

【问题讨论】:

    标签: wpf xaml binding dependency-properties


    【解决方案1】:

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

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

    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    

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

    diagnostics:PresentationTraceSources.TraceLevel=High
    

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

    【讨论】:

    • 对。而且您实际上只能为特定绑定打开扩展跟踪。
    • 感谢您的诊断,太好了,它会派上用场的。但是,诊断并没有告诉我太多关于这个问题的信息。诊断中的最后一个条目是......“TransferValue - 使用最终值'True'”......这是您期望看到的,为什么它没有通过实际属性仍然是个谜。如何在实际 DP 上设置诊断,以便查看那里发生了什么?
    • 您可以将更改的事件添加到 DP 声明中。查看serialseb.blogspot.com/2007/08/… 的示例,然后您可以设置断点等。
    • 好的...所以情节变厚了...DP正在设置,但是,它没有在DP设置器中执行我的代码。我可以把代码放在那里吗?无论哪种方式,我都可以使用 DP 上的 changed 事件来处理该代码。感谢您的帮助,它让我重回正轨。
    • 您不应该在 DP 包装器中添加任何额外的代码,因为包装器 Get 和 Set 不一定在运行时调用。
    【解决方案2】:

    这只是没有意义=)应该工作=)

    您是否尝试在绑定中设置 Mode=TwoWay? 你确定你的DP定义正确吗?您可以将它们添加到帖子中吗?

    【讨论】:

    • 是的,我尝试在绑定中设置 Mode 属性以及 UpdateSourceTrigger,但没有任何帮助。我已经更新了问题
    • 是的,这让事情变得更清楚了。 Th DP 本身不是通过绑定设置的!绑定获取 DP,然后更改其 VALUE,而不是控件上的属性。这是一个常见的问题,我想我也去过那里一次 =) 要获得有关属性更改的通知,您需要回调 (msdn.microsoft.com/en-us/library/ms745795.aspx)... Muad'Dib 的链接也很有用。幸运 =)
    • 谢谢...我已经实施了 Muad'Dib 链接中的解决方案,现在一切正常。
    猜你喜欢
    • 2017-12-24
    • 2014-08-31
    • 1970-01-01
    • 2023-04-07
    • 2014-04-10
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多