DataGridComboBoxColumn и 2 отдельные коллекции

В настоящее время я борюсь с DataGrid в WPF MVVM

У меня есть DataGrid, привязанный к одной коллекции. Он отображается в DataGridTextColumn, как и ожидалось, и заполняет DataGrid. Представьте, что у меня есть 10 предметов. Но мне также нужно иметь по одному столбцу DataGridComboBoxColumn в каждой строке, который будет привязан к отдельной коллекции. Он должен содержать свои ценности, не имеющие отношения к первой коллекции. Используя этот пользователь DataGrid, вы определите привязку между 2 коллекциями, которые не связаны логически.

Код XAML:

<DataGrid Grid.Column="0" AutoGenerateColumns="False" CanUserAddRows="False" 
            ItemsSource="{Binding Path=ItemNamesSetting}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Initial Name item" Binding="{Binding Path=OriginalItemName}" />
        <DataGridTextColumn Header="Final Name item" Binding="{Binding Path=FinalItemName}" />
        <DataGridComboBoxColumn Header="Belongs to" Width="*" 
                                ItemsSource="{Binding Path=AttributesBindingList}"
                                DisplayMemberPath="PropName"/>
    </DataGrid.Columns>
</DataGrid>

Хотя он отображает пустые строки в ComboBox. Я видел несколько примеров, которые работают с привязками DataGridComboBoxColumn к данным, связанным между коллекциями некоторым внешним ключом. Но у меня есть 2 разные коллекции, которые не связаны.

Вы можете посмотреть, где я ошибаюсь с этой привязкой?


person Oleksii    schedule 29.11.2015    source источник
comment
где определяется AttributesBindingList?   -  person Ilan    schedule 29.11.2015
comment
Он устанавливается в виртуальной машине как: public ObservableCollection ‹PropertyBindingViewModel› attributesBindingList; общедоступная ObservableCollection ‹PropertyBindingViewModel› AttributesBindingList {получить {вернуть атрибутыBindingList; } установить {attributeBindingList = значение; OnPropertyChangedHandler (AttributesBindingList); }}   -  person Oleksii    schedule 29.11.2015


Ответы (1)


DataContext вашего DataGridComboBoxColumn - это экземпляр ItemNamesSetting (вы используете OriginalItemName и FinalItemName для DataGridTextColumns), поэтому для использования AttributesBindingList в DataGridComboBoxColumn вам необходимо изменить его DataContext, например, с помощью свойства ElementName:

<Grid DataContext="{Binding MainVM}" Name="MainGrid">
    <DataGrid ItemsSource="{Binding SomeCollection}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>
            <DataGridComboBoxColumn ItemsSource="{Binding DataContext.ComboBoxCollection, ElementName=MainGrid}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

В примере я создал виртуальную машину (MainVM) как DataContext для Grid. У нас есть два свойства - SomeCollection и ComboBoxCollection, но DataGridComboBoxColumn использует DataContext из MainGrid.

person Spawn    schedule 29.11.2015
comment
Отличный ответ, спасибо. Теперь ясно. Я отредактировал ваше сообщение, чтобы исправить XAML - переместил ItemSource из Datagrid.Columns в DataGrid. - person Oleksii; 29.11.2015