2017-12-30 61 views
0

Ich habe ein Ansichtsmodell mit einer Objektgruppe, jedes Objekt verfügt über eine Sammlung von Schlüsseln. Ich möchte DataGridComboBoxColumn so einrichten, dass eine Dropdown-Liste der Schlüssel für jedes Element angezeigt wird. Ich habe ähnliche Fragen gesehen, aber keine der Antworten hat mir geholfen. Wenn ich meine Anwendung starte, sind alle Comboboxen leer. Hier ist meine XAML:DataGridComboBoxColumn kann nicht an eine Ansichtsmodellkollektion gebunden werden

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

Und hier ist meine Ansicht Modell:

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

Und die Aussicht Modell wird auf Fenster wie folgt gebunden:

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

ich eine Templat-Spalte verwenden könnte , aber ich bin daran interessiert, warum dieses bestimmte Beispiel nicht funktioniert, gibt es irgendwelche Probleme mit dem Code? Oder gibt es Einschränkungen für DataGridComboBoxColumn?

Antwort

1

Oder gibt es irgendwelche Einschränkungen zu DataGridComboBoxColumn?

Ja, es gibt einige Einschränkungen. Sie können sie durch das Lesen der Bemerkungen Abschnitt im DataGridComboBoxColumn Class documentation finden:

Um die Dropdown-Liste zu füllen, zuerst die Itemssource-Eigenschaft für das ComboBox durch eine der folgenden Optionen:

Es gibt eine Menge von Umgehungen um dieses Problem zu lösen, zum Beispiel - wie Sie geschrieben haben - Sie eine DataGridTemplateColumn verwenden können.

Ich hoffe, es kann Ihnen helfen.

Verwandte Themen