我有长时间处理操作,为此必须在backGround中完成,但问题是:
我使用了backgroundWorker,然后我使用了listView的Dispatcher,然后是主Dispatcher,但是所有问题都是
我想知道我是否可以使用UIThread,但我不知道如何。
我的代码是:
private void btn_click(object sender, System.Windows.RoutedEventArgs e)
{
string path = fileSourcesCombo.SelectedItem.ToString();
converter = getConverter(path);
this.Dispatcher.BeginInvoke(new Action(delegate()
{
System.Data.DataTable dataTable = converter.getDataTable();
dataGrid.Dispatcher.Invoke(new Action(delegate()
{
dataGrid.ItemsSource = dataTable.DefaultView;
}
));
List<MyAttribute> attributes = converter.attributes;
foreach (MyAttribute attribute in attributes)
{
string name = attribute.name;
string type = attribute.type;
CustomAttribute customAtt = new CustomAttribute(name, type);
ListViewControl.Dispatcher. Invoke(new Action(delegate() { ListViewControl.Items.Add(customAtt); }));
}
}
),System.Windows.Threading.DispatcherPriority.Background);
}
正如我之前所说,没有生成编译错误,只是列表视图似乎在我尝试的所有方法上都填充了空项。
编辑:
当我将ListView更改为ListItem时,它工作,但我不知道为什么? 任何我仍然想要使用listView控件..
这是Xaml代码的工作原理:
<Grid Margin="8,0">
<ListView x:Name="testpanel" Margin="8" BorderThickness="0" DisplayMemberPath="" Style="{DynamicResource SimpleListBox}" ItemContainerStyle="{DynamicResource SimpleListBoxItem}">
</ListView>
</Grid>
如果我从:ItemContainerStyle卸下DynemicResource,它不起作用
答案 0 :(得分:0)
请为您的ListView发布XAML。你可能错过了DisplayMemberPath吗?如果它有项目但不知道要显示什么,那就是它的行为。
答案 1 :(得分:0)
说出什么是罪行是不可能的,但这里有一些可能会有所帮助的事情:
ListView.View
,则应使用ListBox
。DisplayMemberPath
。BeginInvoke
内的所有内容都应该已经在UI线程上,因此内部的其他调度程序调用应该是多余的。 (阅读threading todel reference)converter = getConverter(path)
,则代码中缺少您创建线程的部分,或者发生奇怪的事情,即在代码中调用事件处理程序。testpanel
,但在您调用ListViewControl.Items.Add
的代码中,我希望您的代码发布中存在一些不一致。ItemContainerStyle
可以包含各种会搞砸的事情。