0

私はMVVMの初心者です。メインウィンドウは、WPFツールキットのストックDataGridを使用します。ビューモデルが1つあり、.xaml.csファイルのDataContext_Changedイベントハンドラーのみに依存します。メインウィンドウのDataContextはビューモデルです。

DataGridComboBoxColumnのItemsSourceプロパティをビューモデルのCLRプロパティ"FieldTypes"にバインドしようとしています。「FieldTypes」は、FieldTypeタイプのLinqtoSqlテーブルから派生したリストです。DataGridのItemsSourceは1つのSystem.Data.Linq.Tableからのものであり、「FieldTypes」はのテーブルからのものであり、これら2つのテーブルには関係がありません

FieldTypes DataGridComboBoxColumnをビューモデルの「FieldTypes」プロパティにバインドするために、DataGridTemplateColumnで使用されるDataTemplateStaticResourceを作成しました。

    <DataTemplate x:Key='FieldTypeCombo' >
        <ComboBox DataContext='{Binding ElementName=window, Mode=OneWay, Path=DataContext, UpdateSourceTrigger=PropertyChanged}'
                  ItemsSource='{Binding FieldTypes}'
                  DisplayMemberPath='Name'
                  />
    </DataTemplate>

このDataTemplate、HeaderedContentControl.ContentTemplateなどのDataGridではなくメインウィンドウの子要素で機能しますが、DataGridTemplateColumn.CellTemplateでは機能しないことがわかりました。

DataGridComboBoxColumnをDataGridにない通常のComboBoxのComboBox.ItemsSourceプロパティにバインドしようとすると、

                        <c:DataGridComboBoxColumn Header="FieldType"                                                      
                                      ItemsSource="{Binding ElementName=regularcombobox, Path=ItemsSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"                    
                                      />

期待どおりに機能しますが、DataGrid内のComboBoxでは機能しません。

ビューモデルのプロパティにできるだけ多くのデータバインディングを設定したいのですが、これはStaticResourceの機会のようにも見えます。ただし、接続文字列は後までわからないため、このStaticResourceはウィンドウのロード後に変更されます。ComboBox列のItemsSourceをStaticResourceにバインドする場合でも、これもDynamicResourceもうまくいきませんでした。

MVVMを使用して、DataGrid ComboBox列をDataGridのItemsSourceとは別のコレクションにバインドする方法はありますか?または、ウィンドウのロード後にSQL接続が変更された場合でも、StaticResourceを使用してこれを実現する方法はありますか?

4

1 に答える 1

1

ElementNameバインディングを次のように置き換えてみてください。

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Mode=OneWay, Path=DataContext, UpdateSourceTrigger=PropertyChanged}'

ElementNameは特定のスコープ内の名前のみを解決でき、DataTemplate内でそれらを使用して外部の何かを参照することは一般的にお勧めできません(場合によっては機能しますが)。

于 2010-02-06T19:53:55.940 に答える