0

DataGridにDataGridComboBoxColumnがあり、WPFウィンドウがあります。以下のように、DataContextをWindowに割り当てています。

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


            this.DataContext = cls;

以下は、DataGridComboBoxColumnのXAMLです。

    <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;

とにかく、MVVMを使用してXMAL自体でこのケースを処理することはできますか?私はこのアプローチを使うのを嫌がります。

4

1 に答える 1

2

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 でそのコントロールにプロパティをバインドします。

于 2012-12-29T22:57:20.843 に答える