我想在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属性中。我将如何实现?