Как привязать DataTable к DataGridComboBoxColumn

У меня есть и DataGridComboBoxColumn в DataGrid в окне WPF. Я назначаю DataContext окну, как показано ниже:

cls = new MyClass
            {
                selValue = 2,
                DataGrid = dtGrid,
                ComboGrid = dtCombo
            };


            this.DataContext = cls;

Ниже приведен XAML для DataGridComboBoxColumn:

    <DataGridComboBoxColumn Header="Item Name" SelectedValueBinding="{Binding Path=Item_Id}" SelectedValuePath="ItemId" DisplayMemberPath="ItemName">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
<!-- modified this code as per suggestion ///-->
                    <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.ComboGrid }" />
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.ComboGrid }" />
                </Style>

            </DataGridComboBoxColu

mn.EditingElementStyle>

По-прежнему поле со списком в сетке отображается пустым. В поле со списком нет данных. Затем я написал следующий код в коде Windows, он начал работать.

((DataGridComboBoxColumn)this.testGrid.Columns[1]).ItemsSource = cls.ComboGrid.DefaultView;

Есть ли способ обработать этот случай в самом XMAL с помощью MVVM? Я не хочу использовать этот подход.


person Nps    schedule 29.12.2012    source источник


Ответы (1)


Если itemsSource не входит в datagrids itemssource, вам нужно будет найти предка:

    <DataGridComboBoxColumn itemsSource="{binding RelativeSource={RelativeSource ancestortype=Page}, path=DataContext.YourComboboxItemsSource}" />

Предполагая, что ваша сетка данных находится на странице, вы можете изменить тип предка на что угодно. Однако вы можете использовать relativeSource для чего угодно. Причина использования этого заключается в том, что источник элементов, который вы пытаетесь установить, не является частью иерархии, поэтому он не может его найти. Надеюсь это поможет.

MVVM Я бы сделал что-то вроде:

 public list<string> ComboboxGridItemsSource { get; set; }
 //Then add some data in the property above.
 ComboboxGridItemsSource.add("Hello world1"); , ect...

И когда этот список будет изменен / обновлен, не забудьте поднять свойство с помощью INotifyPropertyChanged.

 //After you implement INotifyPropertyChanged you can raise like this:
 RaiseProperty("ComboboxGridItemsSource");

Используя MVVM, вы обычно не будете вручную устанавливать свойства непосредственно для элемента управления, а скорее привяжете свойства к этому элементу управления в xaml.

person TMan    schedule 29.12.2012
comment
Однако этот подход у меня не сработал. Скорее, это подсказка для решения вышеуказанной проблемы. Я изменил свой исходный пост, чтобы применить этот результат. У меня это сработало отлично. Спасибо - person Nps; 30.12.2012