c# - 更新 CollectionView
问题描述
我正在尝试做一个程序来插入一些材料,如钢铁,然后从 WPF 中开发的界面显示它们。
编辑 :
public class MaterialRegistryPageVm : PageViewModel
{
private ObservableCollection<Material> _materials;
private readonly object _materialsLock = new object();
private Material _material;
private MaterialThickness _materialThickness;
private string _materialFilterFileName;
public ObservableCollection<Material> Materials
{
get
{
_materialCollectionView = CollectionViewSource.GetDefaultView(_materials);
_materialCollectionView.Filter = _DoesMaterialMatchFileNameFilter;
return _materials;
}
set => Set(ref _materials, value);
}
private ICollectionView _materialCollectionView;
private async void _AddMaterialExecution()
{
var material = new Material
{
TimeStamp = DateTime.Now
};
var dialog = new MaterialDialog(material);
var result = await DialogHost.Show(dialog, "RootDialog");
if (!result.Equals(true))
return;
material.Name = material.Name.Trim();
_AddMaterial(material);
lock (_materialsLock)
Application.Current.Dispatcher.BeginInvoke(new Action(() => this.Materials.Add(material)));
Material = material;
if (Mode == ContextMode.Online)
await _NotifyAddMaterialAsync(material);
}
我有一个 DataGrid,它通过异步方法从 ViewModel 填充数据。我的数据网格是:
<Grid Grid.Row="0" Margin="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<Button Command="{Binding AddMaterialCommand, Mode=OneTime}" ToolTip="{DynamicResource Localization.ToolTip.CreateMaterial}" Height="48" Width="48" Style="{StaticResource MaterialDesignOutlinedButton}" materialDesign:ButtonAssist.CornerRadius="0" Padding="0" Margin="0">
<materialDesign:PackIcon Kind="Add" Height="24" Width="24" />
</Button>
<Button Command="{Binding RemoveMaterialCommand, Mode=OneTime}" ToolTip="{DynamicResource Localization.ToolTip.DeleteMaterial}" Width="48" Height="48" Style="{StaticResource MaterialDesignOutlinedButton}" materialDesign:ButtonAssist.CornerRadius="0" Padding="0" Margin="2 0 0 0">
<materialDesign:PackIcon Kind="Minus" Height="24" Width="24" />
</Button>
</StackPanel>
<TextBlock Grid.Column="1" Text="{DynamicResource Localization.Materials}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="32 0 16 0" Style="{StaticResource MaterialDesignHeadline5TextBlock}" />
</Grid>
上Application.Current.Dispatcher.BeginInvoke(new Action(() => this.Materials.Add(material)));
我有这个错误:System.NotSupportedException: 'this type of collectionview does not support changes to its sourcecollection from a thread different from the Dispatcher thread'.
我已阅读这些线程如何通过工作线程更新 ObservableCollection?并且这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程对其 SourceCollection 的更改
但我不太了解,确实我尝试按照建议进行更改Materials.Add(material);
,Application.Current.Dispatcher.BeginInvoke(new Action(() => this.Materials.Add(material)));
但我遇到了同样的错误。
解决方案
推荐阅读
- python - Django 表单无效但未发送错误
- python - Azure IOTEdge - Raspberry Pi 4(standard_init_linux.go:207:exec 用户进程导致“exec 格式错误”)
- javascript - 在页面加载时打开 uikit modal
- azure - 将 allowVolumeExpansion: true 添加到 AKS 中的默认存储类
- java - 测试(if..Else if...Else)语句(不工作)
- node.js - Bootstrap 无法正确加载样式
- python-3.x - 使用 Python 迭代 Visio 形状
- python - 如何在 Abaqus 中使用 Python 脚本创建刚度(节点力/位移)等值线图?
- asp.net-core - 带有查询字符串的 RazorPage 的友好 URL
- c - 在C中使用for循环的系列之和