首页 > 解决方案 > 为什么我可以在不使用 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()。它如何更新数据网格的项目?样式绑定是否也会更新数据网格的项目?

标签: c#wpfdata-binding

解决方案


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
        {
            ...
        });
    }
}

推荐阅读