3

簡単な解決策がないと思う簡単な質問があります。WPFDataGridの一部のグリッド列に複数列のComboBoxが必要です。これを達成するための既知のベストプラクティスはありますか?私が収集したものから、これには、カスタムComboBoxをサポートするためにDataGridComboBoxColumnをサブクラス化する必要があります。

私はこれのいくつかの例を見つけましたが、EFエンティティをサポートしていません(私はCode First EFを使用しています)。

アドバイスをいただければ幸いです。ありがとう

注:これはすべてC#で動的に行われます。XAMLを使用して列を定義していません。

更新:マルチカラムとは、ComboBoxをドロップダウンするときに、「表示」の2つの値を表示する必要があるということです。もちろん、舞台裏ではIDを保存しているだけです。

ここを参照してください:。 複数列のドロップダウン http://www.telerik.com/ClientsFiles/188010_multicolumn-dropdown.JPG

これを、画像に示されている単純なコンボではなく、動的に作成してグリッドに追加できるDataGridColumnとして実行する必要があることを除いて。

更新私はついに、著者が私の-exact-要件を使用してコントロールを開発したCodeProjectに関する記事を見つけることができました。ここにあります。今私が解決しようとしている唯一の問題は、Entity Frameworkを使用しているときにコントロールが機能するようにする方法です(具体的には、コードを最初に)。近くなってる!

4

3 に答える 3

3

私は自分の特定のシナリオの解決策を見つけました。上記の前回の更新のリンクから、DataGridComboBoxColumnサブクラスが含まれているカスタムマルチカラムComboBoxをダウンロードしました。基本的に、これをEntity Framework Code-First POCOで機能させたところ、問題は解決しました。これが、POCOで機能させるために私がしなければならなかったことです。

CustDataGridComboBoxColumnの内部には、いくつかのオーバーライドがあります。次の2つのオーバーライドをわずかに変更する必要があります。コントロールからのプロパティがわからないため、リフレクションを使用してプロパティの設定を変更しています。

元の実装は、SelectedValuePathを使用してDataRowViewから正しい行を取得することでこれを実現しました。

protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
      DataGridCell cell = editingEventArgs.Source as DataGridCell;
      if (cell != null)
      {
        // Changed to support EF POCOs
        PropertyInfo info = editingElement.DataContext.GetType().GetProperty("YourPropertyName", BindingFlags.Public | BindingFlags.Instance);
        object obj = info.GetValue(editingElement.DataContext, null);
        comboBox.SelectedValue = obj;
      }
      return comboBox.SelectedItem;
}

protected override bool CommitCellEdit(FrameworkElement editingElement)
{
    // Dynamically set the item on our POCO (the DataContext).
    PropertyInfo info = editingElement.DataContext.GetType().GetProperty(“YourPropertyName”, BindingFlags.Public | BindingFlags.Instance);
    info.SetValue(editingElement.DataContext, comboBox.SelectedValue, null);
    return true;
}

また、このカスタムコントロールをXAMLではなくコードで完全に動的に作成する場合は、デフォルトで読み取り専用に設定されているため、Columnsプロパティにセッターを追加する必要があります。

//The property is default and Content property for CustComboBox
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ObservableCollection<DataGridTextColumn> Columns
{
    get
    {
       if (this.columns == null)
       {
           this.columns = new ObservableCollection<DataGridTextColumn>();
       }
       return this.columns;
    }
    set
    {
       this.columns = value;
    }
}

提供された意見と回答に感謝します。申し訳ありませんが、最初はもっと意味のある質問を適切に表現することができませんでした。

于 2011-08-24T14:43:35.980 に答える
0

複数の意味を明確にできますか?

以下のいずれかのようなものをお探しですか?

[Column] (Combo) (Combo) (Combo) [Column]

or

[Column] 
(Combo) 
(Combo) 
(Combo) 
[Column]

その場合は、DataGridTemplateColumnタイプを使用して列のセルテンプレートを実装する必要があります。

http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx

これをXAMLで設定してから、必要に応じて列をレンダリングするバインディング用のコレクションをグリッドに提供することができます。

于 2011-08-23T23:47:03.663 に答える
0

「YourPropertyName」の意味は次のとおりです。PropertyInfoinfo=editoringElement.DataContext.GetType()。GetProperty( "YourPropertyName"、BindingFlags.Public | BindingFlags.Instance);

于 2013-11-16T05:10:47.290 に答える