将 ObservableCollection 绑定到 DataGrid

Hau*_*uba 1 wpf .net-4.5

如何将 a 绑定ObservableCollection<updateData> updateCollection到 a DataGrid?我尝试了几种解决方案,但似乎都没有奏效,因为行被添加到集合中但没有显示在网格上。我试图只绑定到类,然后我可以添加行,但是当我尝试编辑它们时,我得到了错误'EditItem' is not allowed for this view。格子如下

<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>
Run Code Online (Sandbox Code Playgroud)

updateData类是以下情况:

public class updateData
{
    public string Price { get; set; }
    public string Quantity { get; set; }
    public string Origin { get; set; }
    public string Hour { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

你所做的看起来是正确的,但如果你错过了一件事,DataContext......什么都不会奏效。这是一个适合你的例子:

这是你的模型:

public class updateData
{
    public string Price { get; set; }
    public string Quantity { get; set; }
    public string Origin { get; set; }
    public string Hour { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想告诉您的视图某些内容已更改,则必须实现该INotifyPropertyChanged接口。

这是您的视图模型:

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

    public updateDataVm()
    {
        updateCollection = new ObservableCollection<updateData>(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

最后这是您的视图(请注意,我已更改ItemsSourceItemsSource="{Binding}"):

<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>
Run Code Online (Sandbox Code Playgroud)

在您的窗口(或一般控制)中:

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

        collection = new updateDataVm();
        DataContext = collection;
    }
}
Run Code Online (Sandbox Code Playgroud)