Не удалось заставить ItemsSource работать динамически для DataGridComboBoxColumn

Я пытаюсь привязать свойство ItemsSource моего DataGridComboBoxColumn к свойству моей ViewModel. Я понимаю, что из-за некоторых ограничений это невозможно без использования какого-либо статического списка или обходного пути.

Я выбрал обходной путь. Я пробовал каждый ответ в этом потоке StackOverflow безуспешно, и совсем недавно я попробовал это временное решение с тоже не повезло.

Вот мой XAML в соответствии с моей последней попыткой:

<DataGridComboBoxColumn Header="Action"
                        SelectedValueBinding="{Binding DISPLAY_ACTION_ID, Mode=TwoWay}"
                        SelectedValuePath="DISPLAY_ACTION_ID"
                        DisplayMemberPath="DISPLAY_ACTION_DESC">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding ActionSource}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding ActionSource}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

Я также попытался настроить привязку ItemsSource в соответствии с этим потоком, но безуспешно.

Вот мое свойство ViewModel на случай, если это поможет:

public List<DISPLAY_ACTION> ActionSource
{
    get
    {
        return _actionSource;
    }
}

Все, что я получаю, - это пустой список значений. Если я поставлю точку останова на получателе свойств, он никогда не сломается, т.е. похоже, что XAML не находит привязку ActionSource. Мы будем очень благодарны за любую помощь или руководство о том, почему это может не работать.

Изменить - обновлен XAML:

<DataGrid HorizontalAlignment="Stretch"
          VerticalAlignment="Top"
          SelectionMode="Single"
          RowHeaderWidth="20"
          AutoGenerateColumns="False"
          AlternatingRowBackground="Transparent"
          ItemsSource="{Binding DisplayItemsView}">
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Action"
                                SelectedValueBinding="{Binding DISPLAY_ACTION_ID, Mode=TwoWay}"
                                SelectedValuePath="DISPLAY_ACTION_ID"
                                DisplayMemberPath="DISPLAY_ACTION_DESC">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding DataContext.ActionSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding DataContext.ActionSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
</DataGrid>

Ошибка отладки:

System.Windows.Data Ошибка: 4: не удается найти источник для привязки со ссылкой RelativeSource FindAncestor, AncestorType = 'System.Windows.Window', AncestorLevel = '1' '. BindingExpression: Путь = DataContext.ActionSource; DataItem = null; целевой элемент - TextBlockComboBox (Name = ''); целевым свойством является ItemsSource (тип IEnumerable) `


person Sloth Armstrong    schedule 13.05.2014    source источник
comment
@dkozl Да, это то, что не работает в соответствии с упомянутым мною ограничением. Это объясняется в эта ветка.   -  person Sloth Armstrong    schedule 13.05.2014
comment
Разве это не должно быть наблюдаемое собрание ‹somemodel›   -  person qamar    schedule 13.05.2014
comment
К чему привязан ваш DataGrid.ItemsSource?   -  person amnezjak    schedule 13.05.2014
comment
@amnezjak Это связано с DisplayItemsView, ListCollectionView из DISPLAY_ITEMs.   -  person Sloth Armstrong    schedule 13.05.2014


Ответы (1)


Предположим, ваш DataGrid привязан к списку MyItem объектов. У вас есть два варианта:

а) Каждый MyItem объект содержит заполненный ActionSource список.

б) Ваша основная ViewModel содержит список объектов MyItem (привязанных к DataGrid) и список ActionSource. Затем вы должны изменить привязку ComboBox ItemsSource на:

<Setter Property="ItemsSource" Value="{Binding DataContext.ActionSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />

В обоих случаях вы должны убедиться, что SelectedValueBinding указывает на свойство объекта MyItem, а не на объект DISPLAY_ACTION.

person amnezjak    schedule 13.05.2014
comment
К сожалению, у меня это все еще не сработало. Я обновил свое сообщение, чтобы отразить мой новый XAML, показывающий ваши изменения. Обратите внимание, что выбранное значение DISPLAY_ACTION_ID фактически является свойством элемента DisplayItemsView, так что все должно быть в порядке. - person Sloth Armstrong; 13.05.2014
comment
Итак, и DISPLAY_ITEM, и DISPLAY_ACTION имеют свойство DISPLAY_ACTION_ID, верно? И они совпадают? Если так, то вроде нормально. Возможно, вам стоит опубликовать свой код ViewModel. Кроме того, попробуйте отладить привязку с помощью этого: stackoverflow.com/a/1125668/1851106 - person amnezjak; 14.05.2014
comment
Да, у них обоих DISPLAY_ACTION_ID, это отношения 1-1. Я попробую отладить, используя ваш опубликованный метод, и вернусь, если мне не повезет. Спасибо за помощь, я ценю это. - person Sloth Armstrong; 14.05.2014
comment
Спасибо за совет по отладке, на самом деле он выдал ошибку. Я обновил свой пост, включив в него сообщение об ошибке. - person Sloth Armstrong; 14.05.2014
comment
Похоже, он не может найти окно под DataGrid. Где он находится в окне? Также попробуйте изменить AncestorType на DataGrid. - person amnezjak; 14.05.2014
comment
Ага, ты был прав. Это на странице, а не в окне. Теперь все отлично работает. Спасибо! - person Sloth Armstrong; 14.05.2014