2016-07-25 18 views
1

Wie binde ich eine ObservableCollection<updateData>updateCollection an eine DataGrid? Ich habe mehrere Lösungen ausprobiert, aber keine scheint zu funktionieren, da Zeilen zur Sammlung hinzugefügt werden, aber nicht im Raster erscheinen. Ich habe versucht, nur an die Klasse zu binden, dann kann ich Zeilen hinzufügen, aber wenn ich versuche, sie zu bearbeiten, bekomme ich den Fehler 'EditItem' is not allowed for this view. Das Gitter ist die folgendeBindung ObservableCollection an DataGrid

<DataGrid Name="dgv" Grid.ColumnSpan="7" AutoGenerateColumns="False" ItemsSource="{Binding updateCollection}" IsSynchronizedWithCurrentItem="True" CanUserAddRows="False"> 
<DataGrid.Columns> 
    <DataGridComboBoxColumn Header="Hour" SelectedValueBinding="{Binding Active}" ItemsSource="{StaticResource hoursList}" DisplayMemberPath="Key" SelectedValuePath="Value"/> 
    <DataGridComboBoxColumn Header="Origin" SelectedValueBinding="{Binding Origin}" ItemsSource="{StaticResource originList}" DisplayMemberPath="Key" SelectedValuePath="Value"/> 
    <DataGridTextColumn Header="P" Binding="{Binding Path=Price}"/> 
    <DataGridTextColumn Header="Q" Binding="{Binding Path=Quantity}"/> 
</DataGrid.Columns> 

Und die updateData Klasse ist die folgende:

public class updateData 
{ 
    public string Price { get; set; } 
    public string Quantity { get; set; } 
    public string Origin { get; set; } 
    public string Hour { get; set; } 
} 
+2

Was "DataContext" DataGrid verwendet? – ASh

+0

Haben Sie Folgendes gesehen: http://stackoverflow.com/questions/18578254/datagrid-edition-edititem-is-not-allowed-for-this-view-when-bound-to-a-wpf-da? – Silvinus

+0

@ASh Ich habe versucht, 'dgv.DataContext = updateCollection' zu setzen, aber es hat nichts geändert. – Hauba

Antwort

3

Was haben Sie sieht richtig, aber wenn Sie eine einzige Sache vermissen, die DataContext ... wird nichts Arbeit. Hier ist ein Beispiel für Dich:

Das ist Ihr Modell:

public class updateData 
{ 
    public string Price { get; set; } 
    public string Quantity { get; set; } 
    public string Origin { get; set; } 
    public string Hour { get; set; } 
} 

Beachten Sie, dass, wenn Sie zu Ihrer Meinung sagen wollen, dass sich etwas geändert hat, können Sie die INotifyPropertyChanged Schnittstelle zu implementieren.

Das ist Ihre Ansichtsmodell:

public class updateDataVm 
{ 
    public ObservableCollection<updateData> updateCollection { get; set; } 

    public updateDataVm() 
    { 
     updateCollection = new ObservableCollection<updateData>(); 
    } 
} 

Und schließlich hier ist Ihre Ansicht (beachten Sie, dass i ItemsSource-ItemsSource="{Binding}" geändert haben):

<Grid> 
    <DataGrid Name="dgv" Grid.ColumnSpan="7" AutoGenerateColumns="False" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" CanUserAddRows="False"> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn Header="Hour" SelectedValueBinding="{Binding Active}" ItemsSource="{StaticResource hoursList}" DisplayMemberPath="Key" SelectedValuePath="Value"/> 
     <DataGridComboBoxColumn Header="Origin" SelectedValueBinding="{Binding Origin}" ItemsSource="{StaticResource originList}" DisplayMemberPath="Key" SelectedValuePath="Value"/> 
     <DataGridTextColumn Header="P" Binding="{Binding Path=Price}"/> 
     <DataGridTextColumn Header="Q" Binding="{Binding Path=Quantity}"/> 
    </DataGrid.Columns> 
</DataGrid> 
</Grid> 

In Ihrem Fenster (oder allgemein zu steuern):

public partial class MainWindow : Window 
{ 
    public updateDataVm collection; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     collection = new updateDataVm(); 
     DataContext = collection; 
    } 
} 
Verwandte Themen