2009-05-13 9 views
1

Ich versuche, meinen Kopf um das WPF-Modell zu wickeln.WPF-Grundlagen: Wie legt man eine externe Eigenschaft in einem DataTrigger fest?

Ich habe ein Listenfeld mit Elementen. Innerhalb der Listbox Elemente sind Zeichenfolge-IDs. Das funktioniert gut. Was ich will ist es so zu haben die Kennung des aktuell ausgewählte Element ist in meinem Code-behind zugänglich für die umschließende Steuer

ich dieses:.

<ListBox.ItemTemplate> 
<DataTemplate> 
    <StackPanel Width="320"> 
    <Label Content="{Binding Path=ShortName}" Style="{StaticResource ListHeader}"/> 
     <TextBlock TextWrapping="Wrap" Text="{Binding Path=Description}" Style="{StaticResource ListText}" /> 
    </StackPanel> 
</DataTemplate> 
</ListBox.ItemTemplate> 

Und ich denke, ich so etwas hinzufügen sollte:

<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"> 
    <Setter Property="" TargetName=""> 
    <Setter.Value> 

    </Setter.Value> 
    </Setter> 
</DataTrigger> 

Aber ich bin verloren bezüglich, wie man den Setter einstellt, um eine Eigenschaft zu setzen, die ein Teil der einschließenden Kontrolle ist (dh die Außenwelt). Ich denke ich habe das irgendwie rückwärts?

Antwort

1

Wenn Sie eine Eigenschaft auf einem ausgewählten Listenfeld Element von außerhalb des listbox zuzugreifen versuchen, dann können Sie die folgenden in Ihrem Code hinter tun:

CustomItem item = (CustomItem)listBox1.SelectedItem; 
MessageBox.Show(item.ShortName); 

Und Ihre XAML ist wie folgt:

<ListBox Height="100" Name="listBox1"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Name="stackPanel1"> 
        <Label Content="{Binding Path=Shortname}"/> 
        <TextBlock Text="{Binding Path=Description}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Sie können das ausgewählte Objekt einfach aus dem Listenfeld in Ihren Objekttyp umwandeln und dann auf die Eigenschaft des Objekts zugreifen.

Hoffe, das war, was Sie wollten.

+0

Sorry das ausgewählte Element ist nicht von einer benutzerdefinierten Klasse, es ist ein StackPanel wie in der ListBox.ItemTemplate über – evilfred

+0

Hallo EvilFred, ich meine Xaml genau wie Ihre, aber Sie binden eine Sammlung von Objekten an die itemsource Eigenschaft der Listbox nehme ich an. Die Eigenschaft selecteditem der Listbox gibt Ihnen Zugriff auf das gebundene Objekt, das nicht die UI-Elemente ausgewählt hat. – Blounty

+0

oh duh, ich verstehe. die magische Trennung von UI von Nicht-UI-Elementen, über die in WPF immer wieder gesprochen wird. Vielen Dank! – evilfred

1

Haben Sie versucht, die SelectedValuePath Eigenschaft zu verwenden?

Wenn Sie eine Liste von, sagen wir Kunden auf der Itemssource-Eigenschaft haben, und stellen Sie die SelectedValuePath auf Name, Ihre SelectedValue Eigenschaft wird den Namen des Kunden anstelle des Kunden zurück ...

In Ihrem Code hinter, wird der SelectedValue den Namen sein, die SelectedItem Ihre Customer-Objekt .. in meinem Beispiel zurückkehren ..

Hope this irgendwie ..

Viel Glück hilft!

Verwandte Themen