ItemsControl ItemTemplate Binding - PullRequest
15 голосов
/ 17 июня 2010

В 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 для этой коллекции.Свойство «Кредит» отображается правильно, а свойство OwnerName - нет.Вместо этого я получаю ошибку привязки:

Ошибка 40: ошибка пути BindingExpression: свойство 'OwnerName' не найдено в 'object' '' ForDisplay '(HashCode = 449124874)'.BindingExpression: Path = OwnerName;DataItem = 'ForDisplay' (HashCode = 449124874);целевым элементом является TextBlock (Name = txtOwnerName ');Свойство target имеет значение «Text» (тип «String»)

. Я не понимаю, почему выполняется поиск свойства OwnerName в классе ForDisplay, а не в классе Owner из ForDisplay.Свойство OwnerData.

Редактировать Похоже, что оно связано с использованием пользовательского элемента управления.Если я связываю те же свойства с 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>

1 Ответ

7 голосов
/ 17 июня 2010

Вы уверены, что код, который вы разместили здесь, является кодом, который вы используете в своем решении? Потому что этот код работает для меня:

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;
...