[英]Dispatcher doesn't update ListBox control
這是ListBox本身:
...
<Window.Resources>
<DataTemplate x:Key="ListBoxTemplate" DataType="ArticlesApp:Article">
<StackPanel Margin="6, 10, 0, 0" Height="45">
<DockPanel>
<TextBlock Text="{Binding Title}" FontWeight="Bold"/>
</DockPanel>
<DockPanel>
<TextBlock Text="{Binding Author, StringFormat='by {0}'}"/>
</DockPanel>
</StackPanel>
</DataTemplate>
</Window.Resources>
...
<ListBox Grid.Row="0" x:Name="ListBox" SelectionChanged="ListBox_OnSelectionChanged" Background="#444444" SelectionMode="Single" ItemTemplate="{StaticResource ListBoxTemplate}"/>
而Dispatcher在后面的代碼中:
public ArticlesView()
{
InitializeComponent();
...
Dispatcher?.BeginInvoke(new Action(() => { ListBox.ItemsSource = GetArticles(); }), DispatcherPriority.Background);
}
public static List<Article> GetArticles()
{
var articles = new List<Article>();
foreach (string file in Directory.GetFiles("articles", "*.json", SearchOption.AllDirectories))
{
File.OpenText(file);
articles.Add(JsonConvert.DeserializeObject<Article>(File.ReadAllText(file)));
}
return articles;
}
它可以在應用程序啟動時工作,將ListBox
ItemSource分配給GetArticles
,但是如果有任何更改,它什么也不做。
代替使用List,使用ObservableCollection,這樣無論何時更改源,它都會自動觸發INotifyPropertyChange和INotifyCollectionChange,而itemsource將從集合中重新獲取。
public static ObservableCollection<Article> GetArticles()
{
var articles = new ObservableCollection<Article>();
foreach (string file in Directory.GetFiles("articles", "*.json", SearchOption.AllDirectories))
{
File.OpenText(file);
articles.Add(JsonConvert.DeserializeObject<Article>(File.ReadAllText(file)));
}
return articles;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.