本次的文献是Wpf mvvm框架下实现表格编辑,在表格内放入下拉框,给表格内的下拉框赋予数据库中的数据如何实现。这个问题困扰了我很久,应为在Mvvm模式下不能直接选择下拉框的名称,直接赋值,然后用普通的下拉框赋值的方法也赋值不了,我也想了办法用Wpf那种下拉框赋值也赋值不了。在网上找了资料也很少,后面找到一个相似的方法,然后根据他的方法改写成了我现在需要的方法才实现了这个功能。
首先这就是我们的XAML 这就是表格内的单位下拉框,然后我们赋值的就是UnitSheet,这个了。
<DataGridTemplateColumn Header="单 位" Width="100" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="100" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.UnitSheet}"
DisplayMemberPath="UnitSheetName" SelectedValuePath="UnitSheetID"
SelectedItem="{Binding UnitSheetID, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"
SelectedValue="{Binding UnitSheetID,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
写好XAML后我们就进入赋值,就是赋值这里比较麻烦,困扰了我很久不知从何下手。
首先我们是有一个实体DingDanHuoPinVo 一般情况下我们的下拉框我们保存的是下拉框的选中值也就是ID。所以我们的表格里面一般没有下拉框的显示值,但在这里想要下拉框显示出来我们就要加下拉框显示值的这样的一个字段。看下图
这里就是我们的实体我们需要加入单位名称这个字段。加入之后我们就可以赋值了。
public class YunShuPeiSongShangPinVO : B_ShippingOrderGoods, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//单位名称
public string UnitSheetName { get; set; }
//复选框
public bool IsSelected { get; set; }
}
赋值的原理就是从数据库查询出来单位的数据,然后for循环把数据一条一条的添加到实体中去,具体操作我们看下图。
//表格单位下拉框
public ObservableCollection<YunShuPeiSongShangPinVO> UnitSheet
{
get
{
ObservableCollection<YunShuPeiSongShangPinVO> ObseDingDanHuoPinVo = new ObservableCollection<YunShuPeiSongShangPinVO>();
//YunShuPeiSongShangPinVO dingDanHuoPinVo = new YunShuPeiSongShangPinVO();
List<D_UnitSheet> UnitSheet = (from tbUnitSheet in myModel.D_UnitSheet select tbUnitSheet).ToList();
for (int i = 0; i < UnitSheet.Count; i++)
{
D_UnitSheet unitSheet = UnitSheet[i];
YunShuPeiSongShangPinVO dingDanHuoPinVo = new YunShuPeiSongShangPinVO
{
UnitSheetName = unitSheet.UnitSheetName,
UnitSheetID = unitSheet.UnitSheetID
};
ObseDingDanHuoPinVo.Add(dingDanHuoPinVo);
}
return ObseDingDanHuoPinVo;
}
}
这样我们的下拉框就有值了,
还有一步就是获取我们选中的下拉框的值,这就是跟我们表格内的单位ID相对应,就可以直接获取到选中的单位ID了。差不多就是这样子啦,赋值和获取就都可以得到了,但是写好这些后我又发现了一个小BUG,就是我们的表格是可以编辑的,但如果我多条数据,我有一条数据选中了下拉框,我的其他数据就编辑不了了。有点(~-~)。但是可以先把其他数据先编辑好再选择下拉框。
先这样吧!
//选中的单位ID
private int _UnitSheetID;
public int UnitSheetID
{
get { return _UnitSheetID; }
set
{
if (_UnitSheetID != value)
{
_UnitSheetID = value;
RaisePropertyChanged(() => UnitSheetID);
}
}
}