С#/WPF: привязка Combobox ItemSource в Datagrid к элементу вне 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;
}
Теперь моя (WPF Toolkit) DataGrid выглядит следующим образом:
<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>
Теперь моя проблема в том, что PreLoadedUserList находится за пределами ItemSource (SomeDataRowList), и я не знаю, как связать что-то вне его. Что я на самом деле хочу:
- Показать в ComboBox PreLoadedUserList
- Задайте значение (RowEntries) SelectedItem.UserAge для значения выбранного ComboboxItem.Age
Сообщите мне, если мое объяснение слишком странное: -)
Спасибо,
Приветствия
Ответы
Ответ 1
Здесь мы идем: -)
<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>
Надеюсь, это тоже поможет кому-то другому.
Приветствия
Ответ 2
Если RowEntries является настраиваемым классом, просто дайте ссылку на PreLoadedUserList. Затем каждый экземпляр имеет указатель на него, и вы можете использовать его в своей привязке.
Просто предложение, имена классов, такие как Users и RowEntries, предполагают, что они являются коллекциями, но ваше использование выглядит так, как будто это элемент, а не коллекция. Я бы использовал уникальные имена, чтобы избежать путаницы. Я бы сделал что-то вроде этого
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);