【问题标题】:WPF: Basic question about Dependency PropertiesWPF:关于依赖属性的基本问题
【发布时间】:2009-04-25 15:06:46
【问题描述】:

我在Window (ArtistInfo) 中有以下 Xaml:

<Grid>
    <TextBlock Text="{Binding Artist.Name}"></TextBlock>
</Grid>

这是同一窗口的代码隐藏(为了问题而简化的代码):

public static readonly DependencyProperty ArtistProperty = 
        DependencyProperty.Register("Artist", typeof(Artist), typeof(ArtistInfo));

Artist Artist {
    get {
        return (Artist)GetValue(ArtistProperty);
    }
    set {
        SetValue(ArtistProperty, value);
    }
}

public ArtistInfo() {
    InitializeComponent();
}
public ArtistInfo(int artistID) {
    InitializeComponent();
    Artist = GetArtist(artistID);
}

基本上我想要做的是数据绑定到一个依赖属性,这样当Artist 被填充(在构造函数中)时,TextBlock 被填充艺术家的名字。

我在这里缺少什么?

【问题讨论】:

    标签: c# wpf data-binding xaml dependency-properties


    【解决方案1】:

    我唯一没有看到的是您更新了 TextBlock 的绑定源。首先给TextBlock添加一个名字

    <TextBlock Name="m_tb" ... />
    

    然后更新构造函数中的DataContext值

    public ArtistInfo() {
     ...
     m_tb.DataContext = this;
    }
    

    EDIT OP 提到可能有多个 TextBlock 或子元素。

    在这种情况下,我会为最接近所有值的父对象执行上述技巧。在本例中为 Grid 控件。可以说,所有内部子项都将继承 DataContext 属性。

    【讨论】:

    • 如果我有其他文本块(例如艺术家姓氏、年龄...),我是否必须设置所有这些 TextBlocks 的 DataContext ?
    • @Dreas,在这种情况下,您应该选择一个父元素并在那里设置 DataContext。它将被子元素“继承”
    • DataContext 在你所有的可视化树中被搜索,所以如果你想让你的所有 TextBlocks 有相同的 DataContext,在 Grid 或 Window 级别设置 DataContext。
    • @Slashene,是的,这正是我所做的。
    【解决方案2】:
    <Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ...>
        <Grid>
            <TextBlock Text="{Binding Artist.Name}"/>
        </Grid>
    </Window>
    

    【讨论】:

      猜你喜欢
      • 2013-01-31
      • 2011-06-29
      • 1970-01-01
      • 2019-04-17
      • 2010-10-09
      • 1970-01-01
      • 2011-07-09
      • 2015-06-27
      • 2010-11-11
      相关资源
      最近更新 更多