ItemsControl ItemTemplate绑定

时间:2010-06-17 15:21:35

标签: wpf binding .net-4.0 itemscontrol itemtemplate

在WPF4.0中,我有一个类包含其他类类型作为属性(组合多个数据类型用于显示)。类似的东西:

public partial class Owner
{
     public string OwnerName { get; set; }
     public int    OwnerId   { get; set; }
}

partial class ForDisplay
{
    public Owner OwnerData { get; set; }
    public int Credit { get; set; }
}

在我的窗口中,我有一个带有以下内容的ItemsControl(为了清晰起见而剪裁):

<ItemsControl ItemsSource={Binding}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
          <local:MyDisplayControl 
                OwnerName={Binding OwnerData.OwnerName}
                Credit={Binding Credit} />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

然后,我从数据层获取显示信息的集合,并将DataContext的{​​{1}}设置为此集合。 “Credit”属性正确显示,但OwnerName属性不正确。相反,我收到了绑定错误:

  

错误40:BindingExpression路径   错误:找不到“OwnerName”属性   在'对象'''ForDisplay'   (的HashCode = 449124874)”。   BindingExpression:路径= OWNERNAME;   的DataItem = 'ForDisplay'   (的HashCode = 449124874);目标要素   是'TextBlock'(Name = txtOwnerName');   target属性是'Text'(类型   '字符串')

我不明白为什么这会尝试在ForDisplay类中查找OwnerName属性,而不是在ForDisplay OwnerData属性的Owner类中查找。

修改 它似乎与使用自定义控件有关。如果我将相同的属性绑定到ItemsControl,它们就能正常工作。

TextBlock

1 个答案:

答案 0 :(得分:7)

您确定此处发布的代码是您在解决方案中使用的代码吗?因为,这段代码对我有用:

XAML

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding OwnerData.OwnerName}"></TextBlock>
                <TextBlock Text="{Binding Credit}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Window的已加载事件

ObservableCollection<ForDisplay> items = new ObservableCollection<ForDisplay>();

for (int i = 0; i < 10; i++)
{
    items.Add(new ForDisplay() { OwnerData = new Owner() { OwnerId = i + 1, OwnerName = String.Format("Owner #{0}", i + 1) }, Credit = i + 1 });
}

DataContext = items;