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