2009-09-30 12 views
12

chciałbym zrobić następujące:C#/WPF: Binding Combobox ItemSource w DataGrid do elementu poza DataContext

public List<Users> PreLoadedUserList { get; set; } 
public List<RowEntries> SomeDataRowList { get; set; } 

public class Users 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
public class SomeDataRowList 
{ 
    public int UserAge { get; set; 
} 

Teraz moja (WPF Toolkit) DataGrid wygląda następująco:

<my:DataGrid AutoGenerateColumns="False" MinHeight="200" 
      ItemsSource="{Binding Path=SomeDataRowList}"> 
    <my:DataGridComboBoxColumn Header="Age" 
           ItemsSource="{Binding Path=PreLoadedUserList}" 
           DisplayMemberPath="Name" 
           SelectedValueBinding="{Binding Path=UserAge}"/> 

</my:DataGrid> 

Teraz mój problem polega na tym, że PreLoadedUserList znajduje się poza ItemSource (SomeDataRowList) i nie wiem, jak powiązać coś poza nim. Co faktycznie chcę go: - Pokazać na combobox PreLoadedUserList - ustawić wartość (RowEntries) SelectedItem.UserAge do wartości wybranego ComboboxItem.Age

Daj mi znać, jeśli moje wyjaśnienie jest zbyt dziwne :-)

Dziękuję Cheers

Odpowiedz

23

Zaczynamy :-)

<my:DataGridTemplateColumn Header="SomeHeader"> 
    <my:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox SelectedValuePath="UserAge" 
       SelectedValue="{Binding Age}" 
       DisplayMemberPath="Name" 
       ItemsSource="{Binding Path=DataContext.PreLoadedUserList, 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
       IsReadOnly="True" Background="White" /> 
     </DataTemplate> 
    </my:DataGridTemplateColumn.CellTemplate> 
</my:DataGridTemplateColumn> 

nadzieję, że może to pomóc ktoś inny też.

Pozdrawiam

+0

Bardzo mi to pomogło ... Dziękuję! –

+0

Wow, próbowałem i próbowałem z "DataGridComboBoxColumn" i nic .. Ale potem MAGIC! Twój piękny przykład działa (z szablonami) Dzięki! –

+0

To pomogło mi rozwiązać moje pytanie, Józefie. Obsługa tego combobox nagłówka była moim następnym zadaniem. Twoje rozwiązanie bardzo mi pomogło i zaoszczędziło mi mnóstwo czasu. Wielkie dzięki. – Tvd

0

Jeśli RowEntries jest klasą zwyczaj, tylko dać mu odniesienie do PreLoadedUserList. Następnie każda instancja ma wskaźnik do niego i można go użyć w wiązaniu.

Po prostu sugestia, nazwy klas, takie jak Użytkownicy i RowEntries, sugerują, że są to kolekcje, ale Twoje użycie wygląda na to, że nie jest to kolekcja. Używałbym pojedynczych nazw, aby uniknąć jakichkolwiek nieporozumień. zrobiłbym coś takiego

public List<User> PreLoadedUserList { get; set; } 
public List<RowEntry> SomeDataRowList { get; set; } 

public class User 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
public class RowEntry 
{ 
    public int UserAge { get; set; } 
    public List<User> PreLoadedUserList { get; set; } 
} 

// at the point where both PreLoadedUserList is instantiated 
// and SomeDataRowList is populated 
SomeDataRowList.ForEach(row => row.PreLoadedUserList = PreLoadedUserList); 
Powiązane problemy