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
我是 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