【发布时间】:2015-07-25 03:07:56
【问题描述】:
我有加载一些长加载日期的列表。我不能使用 ObservableCollection,因为它不能从另一个线程更新。我需要做什么,因为当我使用列表时,UI 上没有任何反应 * *
public class ListViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the ListViewModel class.
/// </summary>
///
private List<StructOfList> items;
public List<StructOfList> Items
{
get { return items; }
set
{
items = value;
RaisePropertyChanged("Items");
}
}
public ListViewModel()
{
Items = new List<StructOfList>();
Items.Add(new StructOfList { Amount = 10, FirstName = "Test", SecondName = "Test" });
AsyncDataLoad();
}
public void AsyncDataLoad()
{
Action<List<StructOfList>> LoadData = new Action<List<StructOfList>>(AddItemToList);
IAsyncResult result = LoadData.BeginInvoke(Items, null, null);
}
public void AddItemToList(List<StructOfList> items)
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(300);
items.Add(new StructOfList {FirstName = "First" , SecondName = "Second" , Amount = i});
RaisePropertyChanged("Items");
}
}
}
Xaml 代码变成了基尔
<Grid>
<ListView ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Content="{Binding FirstName}" Grid.Column="0"></Label>
<Label Content="{Binding SecondName}" Grid.Column="1"></Label>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
【问题讨论】:
-
This answer 可能会有所帮助。
-
进行长时间的操作,然后在 UI 线程上更新 UI。 UI 无法观察列表,因此没有任何效果。调用
RaisePropertyChange("Items")将无济于事,因为ListView将看到对象实际上并未更改并忽略它。