更新绑定控件
本文关键字:控件 绑定 更新 | 更新日期: 2023-09-27 17:55:06
我正在学习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>
c
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" },
};
我有这个,所以它工作得很好。但是现在我的问题是,当我的数据改变时,我如何刷新我的列表框。我在网上找到了几个"解决方案",但没有一个适合我。
您需要通知视图关于您的集合的更改。
当使用ObservableCollection
作为ListBox
控件的源时,视图监听一个事件CollectionChanges
,并在事件引发时更新控件。
将HistoryData
类型更改为ObservableCollection<YourHistoryDataType>
要正常工作,您需要保持相同的集合实例,并且只更新项。
为了保持相同的实例,在视图模型上创建一个属性:
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
将通知视图集合实例被更改。
阅读本文:实现模型-视图-视图模型模式ObservableCollection
和PropertyChanged
事件的一些信息
你的类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));
}
}
我的解决方案是:不要使用绑定。只需通过创建一个集合并将其分配给ItemsSource
属性来填充列表。然后,当数据发生变化时,再做一次。
我不知道为什么WPF要让这么多事情变得很痛苦,但是当很难在stackoverflow上得到一个关于如何刷新列表的明确答案时,或者我正在为这样一个简单的任务阅读一堆文章时,这可能是一个很好的迹象,表明我走错了路。
也许我会找到一个理由进入MVVM设计和绑定。但是现在,我想做的就是更新我的ListBox