2010-06-17 14 views
11

In WPF 4.0 habe ich eine Klasse, die andere Klassen als Eigenschaften enthält (mehrere Datentypen für die Anzeige kombinieren). Etwas wie:ItemsControl ItemTemplate Bindung

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

In meinem Fenster habe ich eine Itemscontrol mit dem folgenden (aus Gründen der Klarheit abgeschnitten):

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

ich dann eine Sammlung von Anzeigeinformationen aus der Datenschicht erhalten, und stellen Sie die DataContext der ItemsControl zu dieser Sammlung. Die Eigenschaft "Kredit" wird korrekt angezeigt, die OwnerName-Eigenschaft jedoch nicht. Stattdessen erhalte ich eine Bindung Fehler:

Error 40: BindingExpression path error: 'OwnerName' property not found on 'object' ''ForDisplay' (HashCode=449124874)'. BindingExpression:Path=OwnerName; DataItem='ForDisplay' (HashCode=449124874); target element is 'TextBlock' (Name=txtOwnerName'); target property is 'Text' (type 'String')

Ich verstehe nicht, warum dies für die Ownername-Eigenschaft in der ForDisplay Klasse zu suchen versucht, anstatt in der Eigentümer-Klasse von der ForDisplay Ownerdata Eigenschaft.

Bearbeiten Es scheint, dass es etwas mit der Verwendung des benutzerdefinierten Steuerelements zu tun hat. Wenn ich dieselben Eigenschaften an eine TextBlock binde, funktionieren sie korrekt.

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

Irgendwie es versucht, die Ownername-Eigenschaft auf ForDisplay Objekt zu finden. Verwenden Sie den folgenden Link zum Debuggen: http://wpftutorial.net/DebugDataBinding.html. Eine weitere Frage: Ist OwnerName auf Ihrem MyDisplayControl eine Abhängigkeitseigenschaft? – decyclone

+1

Ich sehe nichts falsch, wenn man annimmt, was Sie abgeschnitten haben, ist nichts Relevantes verborgen. Haben Sie versucht, die Lösung zu reinigen/wiederherzustellen? Ich hasse diesen Vorschlag, da es gleichbedeutend ist mit dem Befehl "Neustart", aber ich habe eine Datenbindungssituation, die funktionieren sollte, aber nicht, ich finde, dass ein Clean/Rebuild es manchmal behebt. Nicht sicher warum. –

+0

Eine vorläufige Schätzung: Ändern Sie die Bindung, um den Pfad explizit festzulegen. dh "OwnerName = {Binding Path = OwnerData.OwnerName}" –

Antwort

7

Sind Sie sicher, dass der Code, den Sie hier gepostet haben, der Code ist, den Sie in Ihrer Lösung verwenden? Da dieser Code funktioniert für mich:

XAML

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

Fenster Loaded Ereignis

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; 
+0

Ich denke, es hat etwas mit dem benutzerdefinierten Steuerelement zu tun. Siehe Bearbeiten der Frage. –

Verwandte Themen