更新绑定控件

本文关键字:控件 绑定 更新 | 更新日期: 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将通知视图集合实例被更改。

阅读本文:实现模型-视图-视图模型模式
ObservableCollectionPropertyChanged事件的一些信息

你的类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