c# - 为什么我可以在不使用 Observable Collection 或调用 Items.Refresh() 的情况下更新 DataGrid itemsource?
问题描述
标题是正确的。我想知道为什么这是有效的:
我有一个数据网格,它的 ItemsSource 绑定到 type 的属性List<object>
。在后面的代码中,我实例化了一个 new List<object>
,使用循环填充它,然后引发我的PropertyChanged
事件。这导致数据网格被更新。然而,我的印象是我应该使用一个ObservableCollection<object>
而不是一个,List<object>
否则数据网格不会更新......但它确实做到了。
以下是相关代码:
<DataGrid x:Name="dgv_Items"
Grid.Row="3"
Grid.ColumnSpan="19"
Grid.RowSpan="4"
ItemsSource="{Binding ITEMS}"
FontWeight="Bold"
GridLinesVisibility="None"
IsReadOnly="True"
SelectedItem="{Binding SelectedItemI, Mode=TwoWay}"
SelectionMode="Single" SelectionUnit="FullRow">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding Param, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="Conferido">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding Param, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="Achado">
<Setter Property="Foreground" Value="Orange"/>
</DataTrigger>
<DataTrigger Binding="{Binding Param, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="Inexistente">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
public List<ItemImportado> ITEMS { get; set; }
public async Task<bool> ImportaNFE(string path)
{
ITEMS = new List<ItemImportado>();
foreach (var det in TNFE.infNFe.det)
{
ITEMS.Add(new ItemImportado()
{
CodFornec = det.prod.cProd,
DescFornec = det.prod.xProd,
Quant = decimal.Parse(det.prod.qCom, CultureInfo.InvariantCulture),
VlrUnit = decimal.Parse(det.prod.vUnCom, CultureInfo.InvariantCulture),
NItem = int.Parse(det.nItem),
Detalhamento = det
});
}
OnPropertyChanged(null);
}
DataGrid
没有明确的UpdateSourceTrigger
,我没有打电话dgv.Items.Refresh()
。它如何更新数据网格的项目?样式绑定是否也会更新数据网格的项目?
解决方案
UI 已更新,因为您在为集合属性分配新值并向其添加项目后触发 PropertyChanged 事件。
与其每次都创建一个新的集合实例,不如使用只读的 ObservableCollection 属性:
public ObservableCollection<ItemImportado> Items { get; }
= new ObservableCollection<ItemImportado>();
public void ImportaNFE()
{
Items.Clear();
foreach (var det in TNFE.infNFe.det)
{
Items.Add(new ItemImportado
{
...
});
}
}
推荐阅读
- openstack - OpenStack 上的 Concourse Bosh 部署为没有定义 persistent_disk 键值的工作人员创建虚拟机
- unity3d - Unity Editor 脚本用指定 GameObject 的子级填充序列化数组
- javascript - 将夜间叠加层添加到谷歌地图 api
- c++ - 是否可以使用 Wojciech Mula 算法对 __m256i 进行计数并将结果存储在 8 个 32 位字而不是 4 个 64 位字中?
- android - 包“android”中的“appComponentFactory”找不到属性的资源标识符
- python - 在 python 中使用 matplotlib 绘制频率线图
- php - 未使用 PHP 将数据添加到 JSON
- javascript - 如何处理具有嵌套跨度和 div 的可编辑 div 中的退格和删除?
- android - Android Studio:预览不显示
- sql - BCP 和格式文件错误疑难解答