В 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 соединяют ошибку каналом: свойство 'OwnerName', не найденное на 'объектном' ''ForDisplay' (HashCode=449124874)'. BindingExpression:Path=OwnerName; DataItem ='ForDisplay' (HashCode=449124874); целевым элементом является 'TextBlock' (Name=txtOwnerName'); целевое свойство является 'текстом' (введите 'Строку'),
Я не понимаю, почему это пытается искать свойство OwnerName в классе ForDisplay, а не в классе Владельца от свойства ForDisplay OwnerData.
Редактирование кажется, что это имеет некоторое отношение к использованию пользовательского элемента управления. Если я связываю те же свойства с 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>
Вы уверены, что код, который вы разместили здесь - это код, который вы используете в своем решении? Потому что этот код работает для меня :
XAML
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding OwnerData.OwnerName}"></TextBlock>
<TextBlock Text="{Binding Credit}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Window's Loaded Event
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;