ObservableCollection - 数据集上的更改不会更新

时间:2016-04-15 18:02:40

标签: observablecollection

我是winrt编程的新手。我正在使用VS 2015,尝试对ObservableCollection进行一些测试,以了解如何在UI上反映集合中的更改。我一定做错了。只是不知道是什么。

这是我的模特:

class MyItems
{
    public int ItemID { get; set; }
    public string ItemDescription { get; set; }
}
class MyItemList:List<MyItems>
{
    public MyItemList()
    {
        Random r = new Random(DateTime.Now.Day);
        for (int i = 0; i < r.Next(10)+1; i++)
        {
            this.Add(new MyItems() { ItemID = i + 1,
                ItemDescription = string.Format("Item_{0}", i + 1) });
        }
    }
    public ObservableCollection<MyItems> getEven()
    {
        return new ObservableCollection<MyItems>(this.Where(x=>x.ItemID%2==0).ToList());
    }

    public void AddMoreItems(int v)
    {
        int total = this.Count;
        for (int i = 0  ; i < v; i++)
        {
            this.Add(new MyItems() { ItemID = total + i, ItemDescription = string.Format("Item_{0}", total+i) });
        }
    }
}

在MainPage.xaml上,我有一个按钮,可以将项目添加到列表中。我以编程方式创建了一个listview,并以两种方式绑定到数据集。

public sealed partial class MainPage : Page
{
    static MyItemList myItems = new MyItemList();
    public MainPage()
    {
        this.InitializeComponent();
        var t = myItems.getEven();
        ListView myListView = new ListView() { ItemTemplate = (DataTemplate)Resources["myItemTemplate"] };
        myListView.DataContext = t;
        var binding = new Binding();
        binding.Source = t;
        binding.Mode = BindingMode.TwoWay;
        myListView.SetBinding(ListView.ItemsSourceProperty, binding);
        MyGrid.Children.Add(myListView);
    }

    private void AddItems_Click(object sender, RoutedEventArgs e)
    {
        myItems.AddMoreItems(3);
    }
}

当我点击按钮时,会添加3个项目,但它们不会反映在我的列表视图中。除了使用ObservableCollection并将绑定设置为twoWays之外还需要做其他事情吗?

1 个答案:

答案 0 :(得分:1)

你的问题基本上就在这里:

public ObservableCollection<MyItems> getEven()
{
    return new ObservableCollection<MyItems>(this.Where(x=>x.ItemID%2==0).ToList());
}

当您查询this并致电ToList()时,您正在创建一个独立于原始列表的新列表。如果您将项目添加到原始项目,它将不会反映在您的派生列表中。想一想:

public ObservableCollection<MyItems> getEven()
{
    var filteredList = this.Where(x=>x.ItemID%2==0).ToList()
    return new ObservableCollection<MyItems>(filteredList);
}

添加到this根本不会更改内容filteredList

此外,每次访问ObservableCollection而不是修改现有的getEven时都会创建新MyItemList,这意味着添加和删除可观察集合时的事件永远不会触发。

您正在以一种根本不正确的方式使用可观察的集合。为什么不ObservableCollection<T>来自List<T>而不是ICollectionView

Collection that inherits from ObservableCollection - What are the benefits?

此外,如果您尝试按偶数/奇数进行过滤,则应查看ESRI file geodatabase

WPF Binding filtered ObservableCollection ICollectionView to Combobox