我正在学习WPF。我想出了如何使用以下代码绑定到列表框。
XAML
<ListBox Name="lstUpdates" Grid.Row="1" Grid.Column="0" Margin="5,0,5,5" ItemsSource="{Binding HistoryData}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Loaded="lstUpdates_Loaded">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel >
<TextBlock Text="{Binding Header}" FontWeight="Bold" />
<TextBlock Text="{Binding Description}" TextWrapping="Wrap" Height="46" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
CS
public class HistoryRow
{
public string Header { get; set; }
public string Description { get; set; }
public int ArticleUpdateId { get; set; }
}
public IEnumerable<HistoryRow> HistoryData { get; set; }
DataContext = this;
HistoryData = new List<HistoryRow>
{
new HistoryRow { Header = "10/29/1961", Description = "Blah blah" },
new HistoryRow { Header = "12/2/1976", Description = "Blah blah" },
new HistoryRow { Header = "5/24/1992", Description = "Blah blah" },
new HistoryRow { Header = "2/18/2012", Description = "Blah blah" },
};
我有这个,所以它运作得很好。但现在我的问题是如何在数据更改时刷新列表框。我找到了几个&#34;解决方案&#34;在网上,它们都不适合我。
答案 0 :(得分:2)
您需要告知有关收藏品更改的信息
使用ObservableCollection
作为ListBox
控件的来源时,视图会监听事件CollectionChanges
并在事件发生时更新控件。
因此,将HistoryData
的类型更改为ObservableCollection<YourHistoryDataType>
要正常工作,您需要保留相同的收集实例并仅更新项目。
要保持同一实例,请在viewmodel上创建一个属性:
private ObservableCollection<HistoryRow> _HistoryData;
public ObservableCollection<HistoryRow> HistoryData
{
get
{
return _HistoryData;
}
set
{
If(Equals(_HistoryData, value) return;
_HistoryData = value;
this.OnPropertyChange(nameof(this.HistoryData);
}
}
调用OnPropertyChanged
将通知有关该集合实例已更改的视图。
阅读本文:Implementing the Model-View-ViewModel Pattern
有关ObservableCollection
和PropertyChanged
事件
答案 1 :(得分:1)
您的类HistoryRow需要扩展INotifyOfPropertyChange,
然后,它不是使用Ienumerable,而是需要ObservableCollection类型并订阅PropertyChangeEvent
private ObservableCollection<HistoryRow> _historyData;
public ObservableCollection<HistoryRow> HistoryData
{
get {return _historyData}
set {_historyData = value; OnPropertyChange("HistoryData");}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
答案 2 :(得分:-2)
我的解决方案:不要使用绑定。只需通过创建集合并将其分配给ItemsSource
属性来填充列表。然后,当数据发生变化时,再次进行。
我不知道为什么WPF必须让这么多事情变得痛苦,但是如果很难在stackoverflow上找到关于如何刷新列表的明确答案,或者我正在寻找为了这么简单的任务阅读一堆文章,这可能是一个很好的迹象表明我走错了路。
也许我会找到进入MVVM设计和绑定的理由。但就目前而言,我想做的就是更新我的ListBox。