更新绑定控件

时间:2016-07-04 15:09:23

标签: c# wpf binding

我正在学习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;在网上,它们都不适合我。

3 个答案:

答案 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
有关ObservableCollectionPropertyChanged事件

的一些信息

答案 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。