如何在XAML中将一个依赖属性绑定到任何东西上

5

(使用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}"/>
...

但是那并不真正起作用。
4个回答

8
如果您需要将UserControl的xaml中的属性绑定到同一UserControl公开的属性,则可以使用以下模式:
<TextBlock Text="{Binding Parent.Rank, ElementName=LayoutRoot}" />

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

谢谢Anthony...这个方法实际上起作用了,而Akash的方法没有成功,所以如果你正在阅读此信息,请查看Akash答案下的评论,以了解为什么它会失败。这个UserControl实际上是一个子项,并且属于一个列表...再次感谢 :) - JeroenEijkhof
Anthony,我很想了解更多关于这个问题的内容,特别是像Parent.ElementName=这样的东西背后的逻辑/原因是什么...谢谢! - JeroenEijkhof
实际上,对于这个特定的控件,在路径中不使用 Parent. 也可以正常工作。它仍然能够找到它。 - JeroenEijkhof

6
<UserControl xmlns..... 
    x:Name="myUserControl">

....

<Textblock Text="{Binding Rank,ElementName=myUserControl}"/>

....

</UserControl>

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


1
如果UserControl仅用作RootVisual或导航页面,则此方法可以正常工作。但是,如果它被用作子控件,则这种方法可能会失败,因为外部xaml可能会重新分配UserControl名称。 - AnthonyWJones
我没有注意到这样的事情,另一种方法是将相对源指定为self。 - Akash Kava
这个不起作用,因为名称需要在UserControl内的根UIElement上,而不是在UserControl本身上。 - JeroenEijkhof
经过进一步的研究和实验,这确实有效。但是如果使用Parent.路径语法,则无效。因此,似乎ElementName设置了路径应该从哪里开始... - JeroenEijkhof

1

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

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


谢谢您的提示。我该怎么做? - JeroenEijkhof
在VS2010中,可以在“工具”->“选项”->“调试”->“输出窗口”中找到选项。不确定早期版本是否有此选项,但您可以使用PresentationTraceSources在代码中进行调试 - 这可能是一个不错的谷歌术语。 - Will Dean

-1

可能是 <Textblock Text="{Binding Rank}"/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接