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 ');です。ターゲットプロパティは「テキスト」(タイプ「文字列」)です
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>
ここに投稿したコード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;