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

ObservableCollection - Changes on the dataset do not get updated

我是 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,我有一个按钮可以将项目添加到列表中。我以编程方式创建了一个列表视图并以两种方式绑定到数据集。

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 之外还需要做其他事情吗?

你的问题本质上是在这里:

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 的内容。

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

您以根本不正确的方式使用可观察集合。为什么不让 MyItemList 派生自 ObservableCollection<T> 而不是 List<T>

Collection that inherits from ObservableCollection - What are the benefits?

此外,如果您尝试按 even/odd 进行过滤,则应查看 ICollectionView

WPF Binding filtered ObservableCollection ICollectionView to Combobox