web-dev-qa-db-ja.com

ItemsControlItemTemplateバインディング

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>

次に、データレイヤーから表示情報のコレクションを取得し、DataContextItemsControlをこのコレクションに設定します。 「Credit」プロパティは正しく表示されますが、OwnerNameプロパティは正しく表示されません。代わりに、バインディングエラーが発生します。

エラー40:BindingExpressionパスエラー: 'OwnerName'プロパティが 'オブジェクト' '' ForDisplay '(HashCode = 449124874)'に見つかりません。 BindingExpression:Path = OwnerName; DataItem = 'ForDisplay'(HashCode = 449124874);ターゲット要素は 'TextBlock'(Name = txtOwnerName ');です。ターゲットプロパティは「テキスト」(タイプ「文字列」)です

ForDisplay OwnerDataプロパティのOwnerクラスではなく、ForDisplayクラスでOwnerNameプロパティを検索しようとしている理由がわかりません。

編集カスタムコントロールの使用と関係があるようです。同じプロパティを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>
15
Wonko the Sane

ここに投稿したコードISソリューションで使用するコードですか?このコードは私のために機能するためです:

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