首页 > 解决方案 > 更新 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)));但我遇到了同样的错误。

错误: 堆栈跟踪 堆栈跟踪 2

标签: c#wpfexception

解决方案


推荐阅读