ItemsControl ItemTemplate Binding

em WPF4. 0, tenho uma classe que contém outros tipos de classe como propriedades (combinando vários tipos de dados para visualização). Algo do género:

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, tenho um ItemsControl com o seguinte (recorte para clareza):

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

em seguida, obtenho uma coleção de informações de exibição a partir da camada de dados, e configuro o DataContext do ItemsControl para esta coleção. A propriedade "crédito" é exibida corretamente, mas a propriedade de nome próprio não. Em vez disso, tenho uma ligação. erro:

Erro 40: caminho de expressão de Binding erro: a propriedade do 'nome próprio' não foi encontrada em 'object' "ForDisplay' (HashCode=449124874)". BindingExpression: Path=Nome Próprio; DataItem= 'Fordsplay' (HashCode=449124874); elemento-alvo é 'TextBlock' (nome=txtOwnerName'); a propriedade de destino é 'Text' (tipo 'String')

Não percebo porque é que isto está a tentar procurar a propriedade do nome próprio na classe Fordistay, em vez de na classe do proprietário da ... Para mostrar propriedade de dados pessoais.

Editar Parece que tem algo a ver com o uso do controle personalizado. Se eu ligar as mesmas propriedades a um TextBlock, elas 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>
Author: Dave Clemmer, 2010-06-17

1 answers

Tens a certeza que o código que postaste aqui é o código que usas na tua solução? Porque este código funciona para mim.

XAML

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

O evento carregado da janela

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;
 7
Author: decyclone, 2013-06-11 03:05:43