在ObservableCollection中编辑listView项调用XamlParseException (needs

本文关键字:调用 XamlParseException needs listView ObservableCollection 编辑 | 更新日期: 2023-09-27 17:51:19

我是c#和WPF编程的初学者,我正在创建一个具有2个ListView的文件管理器,所有项目都有界。在ListView中有一些GridViewColumn s,首先有CellTemplate,因为我想要文件/文件夹的图标和它的名称。CellTemplate为:

<DataTemplate x:Key="IconTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Image Source="{Binding Path=itemIcon}" Width="20" Grid.Column="0"/>
                <TextBlock Grid.Column="1" Text="{Binding Path=itemName}" />
            </Grid>
        </DataTemplate>

我有一个类:ObservableCollection,其中所有的目录和文件都被添加到集合中,每个文件的图标都是从file转换而来的。MyItem类包含几个字符串用于名称,扩展名等,以及一个ImageSource用于这些图标。一切都很好,直到我意识到,一些文件夹与不同的文件冻结程序,因为转换这些图标。所以现在我为每个文件绑定一些通用图标,然后我想在另一个线程中转换和更改它。所以在主类中,我为项目创建了全局ObservableCollection,因为我不知道如何从listView中加载它们,我已经将填充收集函数从Observable-class移动到主类。现在我可以从新线程更改列表视图中的项目,但是-最后这里是我的问题-我得到XamlParseException -必须在同一线程上创建DependencySource作为DependencyObject。当我试图改变文件的名称(字符串)它工作完美(到目前为止,我测试它只在按钮点击)!我试图根据我在互联网上找到的一些参考实现dependencyObject到MyItem类,但它没有工作。这个改变图标的功能。

for (int i = leftDirectories.Length; i < (leftDirectories.Length + leftFiles.Length); i++)
        {
            FileToImageIconConverter some = new FileToImageIconConverter(locationLeft + leftFiles[i - leftDirectories.Length].Name);
            ImageSource imgSource = some.Icon;
            leftFilesLoad[i].itemIcon = imgSource;
            this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
                    {
                        contentLeft.Items.Refresh();
                    }
            );

相当长的文章,stackoverflow说要具体:-D。非常感谢所有试图帮助我的人。我期待着你的回复,我已经准备好向你展示你需要的所有代码。

在ObservableCollection中编辑listView项调用XamlParseException (needs

发生异常是因为您正在非ui线程上创建ImageSource。除非你冻结对象,否则你不能这样做。您将希望所有与UI相关的逻辑都包含在BeginInvoke调用中。试试这个

for (int i = leftDirectories.Length; i < (leftDirectories.Length + leftFiles.Length); i++)
{
           this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
           {
               FileToImageIconConverter some = new FileToImageIconConverter(locationLeft + leftFiles[i - leftDirectories.Length].Name);
               ImageSource imgSource = some.Icon;
               leftFilesLoad[i].itemIcon = imgSource;
               contentLeft.Items.Refresh();
            }
    );
}