16

在 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为该ItemsControl集合。“Credit”属性正确显示,但 OwnerName 属性没有。相反,我收到一个绑定错误:

错误 40:BindingExpression 路径错误:在“对象”“ForDisplay”(HashCode=449124874)上找不到“OwnerName”属性。绑定表达式:路径=所有者名称;DataItem='ForDisplay' (HashCode=449124874); 目标元素是'TextBlock'(名称=txtOwnerName');目标属性是“文本”(类型“字符串”)

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

编辑 它似乎与使用自定义控件有关。如果我将相同的属性绑定到 a TextBlock,它们将正常工作。

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

1 回答 1

10

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

XAML

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

窗口的加载事件

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;
于 2010-06-17T15:37:32.607 回答