问题: 当后台操作更改 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 绑定也没有帮助。
我不确定这是否被认为是好的做法,但我已经通过再次调用页面的
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 中任何对象的布尔值时引发其事件。
面临类似的问题并修复如下:
someDatagrid.ItemsSource = null; someDatagrid.ItemsSource = someDataSource;