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ď č. 1Ste 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;