【问题标题】:How to bind a Dependency Property to anything in the XAML如何将依赖属性绑定到 XAML 中的任何内容
【发布时间】:2010-07-09 18:40:48
【问题描述】:

(使用 Silverlight 4.0 和 VS 2010)
所以我在我的 C# 文件中创建了一个名为 Rank 的属性。我现在如何将它绑定到 UserControl xaml 文件中的控件?

我的代码:(TopicListItem.xaml.cs)

    #region Rank (DependencyProperty)

    /// <summary> 
    /// Rank 
    /// </summary> 
    public int Rank
    {
        get { return (int)GetValue(RankProperty); }
        set { SetValue(RankProperty, value); }
    }
    public static readonly DependencyProperty RankProperty =
        DependencyProperty.Register("Rank", typeof(int), typeof(TopicListItem),
        new PropertyMetadata(0, new PropertyChangedCallback(OnRankChanged)));

    private static void OnRankChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((TopicListItem)d).OnRankChanged(e);
    }

    protected virtual void OnRankChanged(DependencyPropertyChangedEventArgs e)
    {

    }

    #endregion Rank (DependencyProperty)

我想在我的 TopicListItem.xaml 中这样做

...
<Textblock Text="{TemplateBinding Rank}"/>
...

但这并没有真正起作用。

【问题讨论】:

    标签: c# silverlight silverlight-4.0


    【解决方案1】:

    如果您需要将用户控件的 xaml 中的属性绑定到同一用户控件公开的属性,请使用以下模式:-

    <TextBlock Text="{Binding Parent.Rank, ElementName=LayoutRoot}" />
    

    请注意,这是假设 UserControl 内的根内容元素已被命名为“LayoutRoot”。

    【讨论】:

    • 谢谢安东尼……这实际上有效,而 Akash 没有,所以阅读本文的人请参阅关于 Akash 答案的 cmets 以了解他失败的原因。这个 UserControl 实际上是一个孩子并且是列表的一部分...再次感谢 :)
    • Anthony,我很想阅读更多有关此内容的信息,特别是 Parent.ElementName= 等某些事情背后的逻辑/原因...谢谢!
    • 实际上,对于这个特定的控件,它没有在路径中使用Parent. 就可以工作。还是找到了。
    【解决方案2】:
    <UserControl xmlns..... 
        x:Name="myUserControl">
    
    ....
    
    <Textblock Text="{Binding Rank,ElementName=myUserControl}"/>
    
    ....
    
    </UserControl>
    

    需要将ElementName设置为UserControl的x:Name,如果x:Name为空,则定义一个。

    【讨论】:

    • 如果 UserControl 仅用作 RootVisual 或导航页面,则此方法可以正常工作。但是,如果将其用作子控件,则此方法可能会失败,因为外部 xaml 可能会重新分配 UserControl 名称。
    • 我没有注意到这样的事情,其他方法是将相对来源指定为自我。
    • 这不起作用,因为名称需要在 UserControl 内的根 UIElement 上,而不是在 UserControl 本身上。
    • 在进一步的研究和实验中,这确实有效。但如果使用Parent. 路径语法,则不会。所以,ElementName 似乎设置了路径应该从哪里开始......
    【解决方案3】:

    你需要使用Binding,而不是TemplateBinding,

    您可能还想了解如何向您报告绑定错误 - WPF 中非常有用的默认行为是让您猜测绑定问题,但如果您打开它,您实际上可以获得很多有用的信息。

    【讨论】:

    • 感谢您的提示。我该怎么做?
    • 在 VS2010 中有选项在工具 -> 选项 -> 调试 -> 输出窗口。不确定早期版本,但您可以使用 PresentationTraceSources 在代码中打开灯芯 - 这对 Google 来说可能是个好词。
    【解决方案4】:

    可能是&lt;Textblock Text="{Binding Rank}"/&gt;

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 2011-06-25
      • 2011-12-20
      • 2014-01-09
      • 2023-03-13
      • 2020-08-06
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多