BlackCoin's Corner

In diesem Blog dreht es sich zu 90 % um den Themenbereich C# .Net

SelectedItem aus einem anderen DataContext Binden

Gegeben sein folgende Datenstruktur

public class DataSource : INotifyPropertyChanged {


       public PlzOrtClass[] PlzOrt{get;set;}


       public PlzOrtClass SelectedObj {get{…;}set{…;}}


      …


}

 

Nachdem eine Instance dieses Objektes, dem Property DataContext eines Windows zugewiesen wurde, soll diese Datenstruktur in einer ComboBox Visualisiert werden.

Das reine anzeigen sollte an dieser stelle ja noch kein Problem verursachen.

<Window x:Class="WpfApplication2.Window1" 
    xmlns="<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>" 
    xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel>


… 
        <ComboBox DataContext="{Binding Path=PlzOrt}" ItemsSource="{Binding}" DisplayMemberPath="Ort" SelectedValuePath="Plz"/>


… 
    </StackPanel> 
</Window>

 

Jedoch das Problem, vor dem so manch einer steht, ist nun wie bindet man, dass in der ComboBox Selektierte Element, nun wieder an die Datenstruktur an das Property SelectedObj?

 

Die schnellste Idee die dabei zu tage Tritt, wäre zb

<Window x:Class="WpfApplication2.Window1" 
    xmlns="<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>" 
    xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel>


… 
        <ComboBox DataContext="{Binding Path=PlzOrt}" ItemsSource="{Binding}" DisplayMemberPath="Ort" SelectedValuePath="Plz" SelectedItem="{Binding Path=SelectedObj}"/>


… 
    </StackPanel> 
</Window>

 

Doch wer schon einmal vor dem Problem stand wird schnell erkennen das, dass so nicht funktioniert, denn das Binding an dem Property SelectedItem, benutzt an dieser Stelle den DataContext der ComboBox und der DataContext ist an dieser Stelle ja an das Property PlzOrt gebunden.

 

doch mit einer kleinen Veränderung kommen bekommet man auch dieses Problem wieder in den Griff

<Window x:Class="WpfApplication2.Window1" 
    xmlns="<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>" 
    xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel>


… 
        <ComboBox DataContext="{Binding Path=PlzOrt}" ItemsSource="{Binding}" DisplayMemberPath="Ort" SelectedValuePath="Plz" SelectedItem="{Binding Path=DataContext.SelectedObj, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>


… 
    </StackPanel> 
</Window>

 

Durch die letzte Code Änderung geschieht nun folgendes:

Durch das angeben einer Relativen Quelle (RelativeSource), wird nun nicht mehr der DataContext der ComboBox als Datenquelle benutzt, sondern das erste im Visualtree darüberlegende Element vom Typ Window, und da das Window dann die Datenquelle ist, muss beim Pfad auch genau aus diesem Grund der Pfad um um das Property DataContext erweitert werden.


Posted: Dez 01 2009, 11:19 von Lars Schmitt | mit no comments
Abgelegt unter:

Kommentare

Keine Kommentare

Kommentar abgeben

(verpflichtend) 

(verpflichtend) 

(optional)

(verpflichtend)