c# - 绑定到模型属性的 DataGridComboBoxColumn 不更新
问题描述
我想将 a 绑定DataGridComboBoxColumn
到模型中的一个属性,这是另一个我面临以下两个问题之一的模型:
- 最初显示 DataGridComboBoxColumn 时,不显示 Property 的值,或者
- 显示值,但组合框未正确更新属性
应用启动后的表单(这是一个演示问题的示例应用,真实应用只有一个Vat-Column)
VatCombo1 不显示增值税属性的值
VatCombo2 不显示增值税属性的值
VatCombo3 正确显示了 Vat 属性的值
VatCombo1 的值更改为 19 后的表格 --> VatId 和 VatRate 正确显示
将值 VatCombo3 更改为 19 后的表单 --> 未更新增值税率
我怎样才能到“DataGridComboBoxColumn”工作?即显示存储在模型属性中的初始值,并在从Combobox
右侧选择另一个项目时更改值 Id AND Rate?
Idealley VatCombo1 显示初始负载值的方法?
模型中的属性
private VatModel vat;
public VatModel Vat
{
get { return vat; }
set
{
vat = value;
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Vat)));
}
}
视图模型
public ViewModel()
{
VatList.Add(new VatModel(1, 0.00));
VatList.Add(new VatModel(2, 7.00));
VatList.Add(new VatModel(3, 19.00));
VatModel receiptItemVat = new VatModel(2, 7.00);
ReceiptItemModel receiptItem = new ReceiptItemModel(1, receiptItemVat);
ReceiptModel receipt = new ReceiptModel();
receipt.Id = 10;
receipt.Items.Add(receiptItem);
Receipt = receipt;
}
夏尔姆
<Window x:Class="datagridcombo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:datagridcombo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Window.Resources>
<CollectionViewSource Source="{Binding VatList}" x:Key="VatListRes"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Content="{Binding Receipt.Id}"/>
<DataGrid ItemsSource="{Binding Receipt.Items}" Grid.Row="1" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ReceiptItemId" Binding="{Binding Id}" Width="80"/>
<DataGridTextColumn Header="VatId" Binding="{Binding Vat.Id}" Width="80"/>
<DataGridTextColumn Header="VatRate" Binding="{Binding Vat.Rate}" Width="80"/>
<!-- Initial value not shown, Property update works -->
<DataGridComboBoxColumn Header="VatCombo1"
ItemsSource="{Binding Source={StaticResource VatListRes}}"
SelectedItemBinding="{Binding Vat, UpdateSourceTrigger=PropertyChanged}"}"
DisplayMemberPath="Rate"
/>
<!-- Initial value not shown, Property update when Enter is hit -->
<DataGridComboBoxColumn Header="VatCombo2"
ItemsSource="{Binding Source={StaticResource VatListRes}}"
SelectedValuePath="Id"
DisplayMemberPath="Rate"
/>
<!-- Initial value not shown, Property not updated -->
<DataGridComboBoxColumn Header="VatCombo3"
ItemsSource="{Binding Source={StaticResource VatListRes}}"
SelectedValueBinding="{Binding Vat.Id, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Id"
DisplayMemberPath="Rate"
/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
解决方案
链接对象时,请始终确保使用相同的引用。在您的情况下,您将所选项目链接到 的项目源ComboBox
,但初始值的实例不是ComboBox.ItemsSource
. 所以ComboBox
不会选择任何东西。ComboBox
或者ItemsControl
通常也检查引用相等性,以便知道在SelectedItem
设置时选择哪个项目。
要解决此问题,请使用以下实例初始化所选值ItemsSource
:
public ViewModel()
{
VatList.Add(new VatModel(1, 0.00));
var initialSelectedItem = new VatModel(2, 7.00);
VatList.Add(initialSelectedItem);
VatList.Add(new VatModel(3, 19.00));
VatModel receiptItemVat = initialSelectedItem;
ReceiptItemModel receiptItem = new ReceiptItemModel(1, receiptItemVat);
ReceiptModel receipt = new ReceiptModel();
receipt.Id = 10;
receipt.Items.Add(receiptItem);
Receipt = receipt;
}
推荐阅读
- android - Finish() 没有关闭我的第二个 Activity,OnBackPressed() 破坏了应用程序
- r - 脚本生成 Y 轴,但不生成 X 轴
- dependency-injection - .NET Core 是否支持服务定位器模式?
- sql - SQL。计算每组列的变化
- node.js - 我在尝试将 babel 安装到我的 node.js 项目中时遇到问题
- c# - LINQ交叉连接列表列表?未知数量列表的笛卡尔积
- matlab - MIJ:在 Matlab 中执行 imageJ(斐济)宏直到结束
- algorithm - 您如何解决数据结构和算法问题?
- javascript - Array.prototype.sort “[比较] UTF-16 代码单元顺序中的字符串”是什么意思?
- python - FileNotFoundError: [Errno 2] 我不知道为什么我的文件路径不存在