3

T の ObservableCollection を DataGrid の DataGridComboBoxColumn にバインドしようとしています。
DataGrid の定義は次のとおりです。

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Model, IsAsync=True}">

     <DataGrid.Columns>
         <DataGridTextColumn  Header="Column Entry"  IsReadOnly="True" Binding="{Binding ColumnName}"/>
         <DataGridComboBoxColumn Header="Road Type" ItemsSource="{Binding RoadTypes}"/>
    </DataGrid.Columns>

</DataGrid>

これはViewModelとModelです

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var viewModel = new ViewModel();
        DataContext = viewModel;
    }
}

public class ViewModel : ViewModelBase
{
    private ObservableCollection<Model> _model;

    public ViewModel()
    {
        var list = new List<Model>();
        var roadTypes = new ObservableCollection<RoadType>
                            {
                                new RoadType
                                    {
                                        Code = 1,
                                        Id = 1,
                                        Name = "Name1"
                                    },
                                new RoadType
                                    {
                                        Code = 1,
                                        Id = 1,
                                        Name = "Name1"
                                    }
                            };

        Model = new ObservableCollection<Model>
                    {
                        new Model
                            {
                                ColumnName = "Col1",
                                RoadTypes = roadTypes
                            },
                        new Model
                            {
                                ColumnName = "Col1",
                                RoadTypes = roadTypes
                            }
                    };
    }

    public ObservableCollection<Model> Model
    {
        get { return _model; }
        set
        {
            _model = value;
            RaisePropertyChanged(() => Model);
        }
    }
}

public class RoadType
{
    public int Id { get; set; }
    public int Code { get; set; }

    public string Name { get; set; }
}

public class Model : ObservableObject
{
    private ObservableCollection<RoadType> _roadTypes;
    public string ColumnName { get; set; }

    public ObservableCollection<RoadType> RoadTypes
    {
        get { return _roadTypes; }
        set
        {
            _roadTypes = value;
            RaisePropertyChanged(() => RoadTypes);
        }
    }
}

DataGrid はテキスト列も表示しますが、ComboBox 値は表示しません。
どうしたの?

4

1 に答える 1

12

RoadTypes は文字列の単純なリストではないため、ComboBox に表示する必要があるプロパティをコンボボックスに伝える必要があります。追加してみる

DisplayMemberPath="Name" 

あなたのコンボボックス宣言に

--

アップデート:

さて、これは WPF データグリッドの既知の「機能」です。問題は、DataGridComboBox に DataGrid の DataContext がないことです。ComboBox のバインディングを次のように変更しました。

<DataGridComboBoxColumn DisplayMemberPath="Name">
     <DataGridComboBoxColumn.ElementStyle>
             <Style>
                <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=RoadTypes}" />
             </Style>
      </DataGridComboBoxColumn.ElementStyle>
      <DataGridComboBoxColumn.EditingElementStyle>
              <Style>
                  <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=RoadTypes}" />
              </Style>
       </DataGridComboBoxColumn.EditingElementStyle>
  </DataGridComboBoxColumn>

ダウンロード リンクで提供されたコードを変更したところ、コンボボックスのドロップダウンを開いたときにコンボボックスの項目が表示されました。

さらに明確にするために、これらのリンクのいくつかをチェックしてください。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b4b13a72-47f9-452f-85c6-6c4b5b606df5/

コレクションを WPF:DataGridComboBoxColumn にバインドする方法

Excedrin の頭痛の種 #3.5.40128.1: WPF DataGrid でコンボ ボックスを使用する

これらのサイトをすべて見るようになったのは、[出力] ウィンドウを見て、エラー メッセージSystem.Windows.Data Error: 2 : ターゲット要素の管理 FrameworkElement または FrameworkContentElement が見つかりません。メッセージ

于 2013-04-30T15:09:22.647 に答える