2017-12-19 3 views
0

Ich habe ein benutzerdefiniertes DataGrid erstellt, in dem Spalten von Comboboxen definiert sind. Ich habe versucht, den Itemsource-Wert der Combobox zur Verfügung zu stellen, aber er füllt Daten in Comboboxen zur Laufzeit nicht auf. Hier ist der C# - und XAML-Code.ComboBox zeigt keine verbindlichen Daten in einer DataGridTemplateColumn

public MainWindow() 
{ 
    InitializeComponent(); 
    datagrid_additionalinfo.Items.Add(new object()); 

    datagrid_additionalinfo.DataContext = new ComboboxViewModel(); 
} 

public class ComboboxViewModel 
{ 
    public List<string> Members { get; set; } 
    public List<string> Disciplines { get; set; } 

    public ComboboxViewModel() 
    { 
     this.Members = new List<string> 
     { 
      "Ali", "Mubashar", "Muffassir", "Nitin" 
     }; 

     this.Disciplines = new List<string> 
     { 
      "Architecture", "Mechanical", "Structure" 
     }; 
    } 
} 

<DataGrid Name="datagrid_additionalinfo" Margin="20,0,20,0" IsReadOnly="False" SelectionMode="Single" CanUserAddRows="True" AutoGenerateColumns="False" SelectionUnit="Cell" > 

    <DataGrid.Columns> 

      <DataGridTemplateColumn Header="Discipline" Width="100" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox Width="200" ItemsSource="{Binding Disciplines}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Members" Width="100"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox Width="200" ItemsSource="{Binding Members}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

    </DataGrid.Columns> 

</DataGrid> 

Bitte korrigiert mich, wenn ich etwas fehlt bin. Vielen Dank.

Antwort

1

Datagrid-Spalten sollten in der 'Spalten' Tag platziert werden:

<DataGrid ...> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Discipline" Width="100" > 
      ... 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Header="Members" Width="100"> 
      ... 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

Und wenn Sie Artikel von Code füllen bevorzugen, die Sie nicht verwenden Datacontext benötigen, schreiben Sie einfach:

public MainWindow() 
    { 
     InitializeComponent(); 
     datagrid_additionalinfo.Items.Add(new ComboboxViewModel());    
    } 

Edit:

Wenn Sie Datacontext bevorzugen, ein Ansichtsmodell erstellen, das alle Elemente enthält, zum Beispiel:

public class MainViewModel 
{ 
    public List<ComboboxViewModel> Items { get; set; } 

    public MainViewModel() 
    { 
     Items = new List<ComboboxViewModel>() { new ComboboxViewModel()}; 
    } 
} 

Und dann binden sie in XAML:

<DataGrid Name="datagrid_additionalinfo" ItemsSource="{Binding Items}" ...> 

Und Setup Datacontext:

public MainWindow() 
{ 
    InitializeComponent(); 
    datagrid_additionalinfo.DataContext = new MainViewModel(); 
} 
+0

Vielen Dank für den XAML-Code teilen. Ich habe diese Zeile wirklich übersehen, als ich den Code hier eingefügt habe. Plus ich kann nicht datagrid_additionalinfo.Items.Add (neue ComboboxViewModel()); Code. Weil mein Datagrid Textfelder enthält, damit der Benutzer Daten eingeben kann. Es ist ein bisschen kompliziert. Haben Sie irgendwelche Lösungen, um die Daten in XAML zu binden? –

+0

Ja, siehe bearbeitete Antwort – Netstep

+0

Vielen Dank, es hat funktioniert :-) –

Verwandte Themen