2017-12-30 57 views
0

ビューモデルにアイテムのコレクションがあり、各アイテムにキーのコレクションがあります。私は各項目のキーのドロップダウンリストを表示するDataGridComboBoxColumnを作成します。私は同様の質問を見ましたが、答えのどれも私を助けませんでした。アプリケーションを実行すると、すべてのコンボボックスが空になります。ここに私のXAMLは次のとおりです。DataGridComboBoxColumnをビューモデルコレクションにバインドできません。

using System.Collections.ObjectModel; 
using System.ComponentModel; 

namespace TestDataGridCombobox 
{ 
    public class MyViewModel : INotifyPropertyChanged 
    { 
     public MyViewModel() 
     { 
      Items.Add(new MyItem { Name = "Item1" }); 
      Items.Add(new MyItem { Name = "Item2" }); 
      Items.Add(new MyItem { Name = "Item3" }); 
     } 

     private ObservableCollection<MyItem> items = new ObservableCollection<MyItem>();   
     public ObservableCollection<MyItem> Items 
     { 
      get { return items; } 
      set 
      { 
       if (items == value) 
        return; 
       items = value; 
       OnPropertyChanged("Items"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnPropertyChanged(string property) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

    public class MyItem : INotifyPropertyChanged 
    { 
     public MyItem() 
     { 
      Keys.Add("Key1"); 
      Keys.Add("Key2"); 
      Keys.Add("Key3"); 
      SelectedKey = "Key1"; 
     } 

     private string name; 
     public string Name 
     { 
      get { return name; } 
      set 
      { 
       if (name == value) 
        return; 
       name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 

     private string selectedKey; 
     public string SelectedKey 
     { 
      get { return selectedKey; } 
      set 
      { 
       if (selectedKey == value) 
        return; 
       selectedKey = value; 
       OnPropertyChanged("SelectedKey"); 
      } 
     } 

     private ObservableCollection<string> keys = new ObservableCollection<string>(); 
     public ObservableCollection<string> Keys 
     { 
      get { return keys; } 
      set 
      { 
       if (keys == value) 
        return; 
       keys = value; 
       OnPropertyChanged("Keys"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnPropertyChanged(string property) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
} 

、ビューモデルは、このようなウィンドウにバインドされています:

public partial class MyWindow : Window 
{ 
    public MyWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MyViewModel(); 
    } 
} 

私はテンプレート列を使用することができ

<Window 
    x:Class="TestDataGridCombobox.MyWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Name}"/> 
      <DataGridComboBoxColumn ItemsSource="{Binding Path=Keys}" SelectedValueBinding="{Binding Path=SelectedKey}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Window> 

そしてここでは、私の見解モデルがありますしかし、私はこの特定の例がうまくいかない理由、コードに問題があるのに興味がありますか?または、DataGridComboBoxColumnに制限がありますか?

答えて

1

DataGridComboBoxColumnには何か制限がありますか?

はい、いくつかの制限があります。最初に次のいずれかのオプションを使用してComboBoxのためにItemsSourceプロパティを設定し、ドロップダウンリストを移入するに

この問題を解決するための回避策の多くは、たとえば、あります - あなたが書いたように - あなたはDataGridTemplateColumnを使用することができます。

私はそれがあなたを助けることを願っています。

関連する問題