如何将DataGridComboBoxColumn绑定到集合和属性

时间:2019-06-10 09:02:31

标签: c# wpf xaml mvvm datagrid

我想在WPF窗口中构建一个DataGrid,该窗口显示了
送货单。每行包括项目描述,数量和单位。我想在单位栏中显示一个DataGridComboBoxColumn

从中选取单位的列表在ViewModel中定义:

public ICollectionView UnitsList { get; set; }

public ViewModel()
{
    UnitsList = CollectionViewSource.GetDefaultView(new Observablecollection<UnitModel>());

    UnitsList.Add(new UnitModel() {Id = 1, Desc="hour"};
    UnitsList.Add(new UnitModel() {Id = 2, Desc="piece"};
    //aso….

}

每个发票的项目存储在模型的集合中

public class DevSlipModel()
{
    public int Id {get; set;}

    public string Desc {get; set;}

    public ObservableCollection<DesSlipItem> Items

    //...
}

项目模型如下:

public class DesSlipItem()
{
    public int Id {get; set;}

    public string Desc {get; set;}

    public double Amount {get; set;}

    public UnitModel Unit {get; set;}

    //...

}

UnitModel的定义如下:

public class UnitModel()
{
     public int Id {get; set;}

     public string Desc {get; set;}
}

我试图这样设置专栏:

<DataGrid Grid.Row="5" ItemsSource="{Binding Items}">
    <DataGridComboBoxColumn DisplayMemberPath="Desc" SelectedValuePath="Id" SelectedValueBinding="{Binding Unit.Id}" Header="Unit" Width="75">
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Path=DataContext.UnitsList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
                    <Setter Property="DisplayMemberPath" Value="Desc"/>                            
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
    </DataGridComboBoxColumn>
</DataGrid>

有了这个,当我打开一个现有记录时,在单位列中没有显示任何值。如果我在一行中打开组合框,则会显示正确的单位。

根据我的理解,实体存在问题,因为item对象中的单元与集合中的单元是不同的对象。在正确的mvvm模式中实现下拉列表的最佳方法是什么?

此外,当添加新项目时,必须将从列表中选择的单位对象的副本存储在项目的unit属性中。我将如何实现?

0 个答案:

没有答案