ItemsControl ItemTemplate Ligação
No WPF4.0, tenho uma classe que contém outros tipos de classe como propriedades (combinando vários tipos de dados para exibição). Algo como:
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; }
}
Na minha janela, eu tenho um ItemsControl com o seguinte (cortado para maior clareza):
<ItemsControl ItemsSource={Binding}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:MyDisplayControl
OwnerName={Binding OwnerData.OwnerName}
Credit={Binding Credit} />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Em seguida, pego uma coleção de informações de exibição da camada de dados e defino oDataContext
doItemsControl
para esta coleção. A propriedade "Crédito" é exibida corretamente, mas a propriedade OwnerName não. Em vez disso, recebo um erro de ligação:
Erro 40: Erro no caminho BindingExpression: propriedade 'OwnerName' não encontrada em 'object' '' ForDisplay '(HashCode = 449124874)'. BindingExpression: Path = OwnerName; DataItem = 'ForDisplay' (HashCode = 449124874); o elemento de destino é 'TextBlock' (Name = txtOwnerName '); propriedade de destino é 'Texto' (digite 'String')
Não entendo por que isso está tentando procurar a propriedade OwnerName na classe ForDisplay, em vez de na classe Owner da propriedade ForDisplay OwnerData.
Editar Parece que isso tem algo a ver com o uso do controle personalizado. Se eu vincular as mesmas propriedades a umTextBlock
, eles funcionam corretamente.
<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>