/ / ItemsControl ItemTemplate Binding - wpf, väzba, .net-4.0, itemcontrol, itemtemplate

ItemControl ItemTemplate Väzba - wpf, binding, .net-4.0, itemscontrol, itemtemplate

Vo WPF4.0 mám triedu, ktorá obsahuje ďalšie vlastnosti triedy ako vlastnosti (kombináciu viacerých typov údajov na zobrazenie). Niečo ako:

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

V mojom okne mám položku ItemControl s nasledujúcim textom (pre lepšiu prehľadnosť):

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

Potom získam zbierku zobrazovaných informácií z dátovej vrstvy a nastavím DataContext z ItemsControl do tejto zbierky. Vlastnosť „Kredit“ sa zobrazí správne, ale vlastnosť OwnerName nie. Namiesto toho sa mi zobrazuje chyba väzby:

Chyba 40: BindingExpression path chyba: Vlastnosť „OwnerName“ sa nenašla na "objekt" "" ForDisplay " (HashCode = 449124874) ". BindingExpression: Cesta = OwnerName; DataItem = "ForDisplay" (HashCode = 449124874); cieľový prvok je "TextBlock" (Name = txtOwnerName "); cieľová vlastnosť je „text“ (typ "String")

Nerozumiem, prečo sa to pokúša hľadať vlastnosť OwnerName v triede ForDisplay, nie v triede Owner z vlastníctva ForDisplay OwnerData.

editovať Zdá sa, že to má niečo spoločné s použitím vlastného ovládacieho prvku. Ak viažu rovnaké vlastnosti na a TextBlock, fungujú správne.

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

odpovede:

7 pre odpoveď č. 1

Ste si istí, že kód, ktorý ste tu uverejnili, je kódom, ktorý používate vo svojom riešení? Pretože tento kód funguje pre mňa:

XAML

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

Udalosť načítaná z okna

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;