Подтвердить что ты не робот

С#/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

Сообщите мне, если мое объяснение слишком странное: -)

Спасибо, Приветствия

4b9b3361

Ответ 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);