有没有办法在绑定的 ItemsSource 更改后强制 WinUI 3 Datagrid 刷新(重新渲染)?

问题描述 投票:0回答:2
  1. 我正在使用 CommunityToolkit.WinUI.UI.Controls.DataGrid 控件。
  2. ItemsSource 属性绑定到对象的 ObservableCollection。
  3. 这些对象有一个布尔类型的属性,我将复选框绑定到该属性。

问题: 当后台操作更改 ObservableCollection 中某些对象的布尔值时,数据网格不会反映新值(选中或未选中复选框)。

但是,如果我滚动数据网格,使受影响的行不再可见,然后滚动回受影响的行,该值现在会正确呈现。

因此有一个解决方法 - 除了没有足够行数可滚动的数据网格之外。

适用代码:

<controls:DataGrid Grid.Row="1" AutoGenerateColumns="False" ItemsSource="{Binding UiModel.Dictionary.Values}" CanUserReorderColumns="False" GridLinesVisibility="All" BorderBrush="LightGray" BorderThickness="1" PointerPressed="DataGrid_PointerPressed">

UIModel.Dictionary.Values 定义:

IDictionary<string, ObservableCollection<MyClass<T>>>

为 IDictionary 分配一个 ObservableDictionary,如 https://learn.microsoft.com/en-us/uwp/api/windows.foundation.collections.iobservablemap-2?view=winrt-22621 所定义。

MyClass 定义:

using CommunityToolkit.Mvvm.ComponentModel;
public class MyClass<T> : ObservableObject
{
    public string Display { get; set; }
    public T Identifier { get; set; }
    private bool _selected;
    public bool Selected
    {
        get { return _selected; }
        set
        {
            _ = SetProperty(ref _selected, value);              
        }
    }
}

DataTemplate 绑定:

<controls:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox Style="{StaticResource CompactCheckbox}" IsChecked="{Binding Path=[0].Selected, Mode=TwoWay}" HorizontalAlignment="Center" MinWidth="0" />
    </DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>

UpdateSourceTrigger=PropertyChanged 添加到 CheckBox 绑定没有帮助。

还将 Mode=TwoWay, UpdateSourceTrigger=PropertyChanged 添加到 DataGrid 的 ItemsSource 绑定也没有帮助。

datagrid winui-3 maui-community-toolkit
2个回答
0
投票

我不确定这是否被认为是好的做法,但我已经通过再次调用页面的

InitializeComponent()
方法解决了这个问题。

尝试创建一个包含类似内容的事件处理程序:

public void RefreshGrid(object sender, EventArgs e)
{
    _contentLoaded = false; // Reset page loaded status
    InitializeComponent();
    //Additional actions - I had to handle other events that were raised as 
    //a result of calling InitializeComponent() again here
}

然后,当您的代码更改 ObservableCollection 中任何对象的布尔值时引发其事件。


0
投票

面临类似的问题并修复如下:

someDatagrid.ItemsSource = null; someDatagrid.ItemsSource = someDataSource;

© www.soinside.com 2019 - 2024. All rights reserved.