C# 在筛选这个可观察的集合时,我是否遗漏了什么?
我有一个从xml提要解析数据的例程C# 在筛选这个可观察的集合时,我是否遗漏了什么?,c#,windows-phone-7,C#,Windows Phone 7,我有一个从xml提要解析数据的例程 ... matches.Add(_item); } 在这之后不久,我只想包括与where子句匹配的项 if (this.MatchType == FixtureType.Played) { matches = matches.ToList().Where( m => m.matchResult == "D" ).ToObservableCollection(); } 在此之后,
...
matches.Add(_item);
}
在这之后不久,我只想包括与where子句匹配的项
if (this.MatchType == FixtureType.Played)
{
matches = matches.ToList().Where(
m =>
m.matchResult == "D"
).ToObservableCollection();
}
在此之后,如果我设置断点,我会注意到匹配项现在包含我要查找的项
现在的问题是,绑定到ObservaleCollection的控件仍然具有初步数据。问题是,在此场景中有2个
ObservaleCollection
实例
- 控件绑定到的原始控件
- 您通过调用
创建的新集合ToObservableCollection
ObservableCollection
实例。这将导致无法内联修改原始实例
var results = matches.Where(m => m.matchResult == "D").ToList();
matches.Clear();
foreach (var cur in results) {
matches.Add(cur);
}
问题是,在这个场景中有2个
ObservableCollection
实例
- 控件绑定到的原始控件
- 您通过调用
创建的新集合ToObservableCollection
ObservableCollection
实例。这将导致无法内联修改原始实例
var results = matches.Where(m => m.matchResult == "D").ToList();
matches.Clear();
foreach (var cur in results) {
matches.Add(cur);
}
这是因为您的控件重新绑定到
matches
的旧实例,您正在创建一个新的可观察集合并将其分配给matches
,但是您的控件没有绑定到matches
变量,而是绑定到matches
时的值。您应该改为修改匹配项并删除所有与您的条件不匹配的项。这是因为您的控件重新引用了matches
的旧实例,您正在创建一个新的可观察集合并将其分配给matches
,但您的控件未绑定到matches
变量,但与绑定时的值匹配。您应该改为修改匹配项并删除所有与您的条件不匹配的项。我想问您为什么要绑定一个编程变量
使用MVVM框架(如MVVM Light)可以很好地分类这些场景
只要在视图模型中有一个属性并将您的视图绑定到该属性,当您更新视图模型时,页面将自动更新
有很多这样的例子,包括开发工具中的数据绑定模板(实现基本notifypropertychanged行为),更好的方法是升级到MVVM light(http://mvvmlight.codeplex.com)或者更进一步的是像卡尔伯恩这样的(http://caliburnmicro.codeplex.com/)我想问,为什么要绑定一个编程变量
使用MVVM框架(如MVVM Light)可以很好地分类这些场景
只要在视图模型中有一个属性并将您的视图绑定到该属性,当您更新视图模型时,页面将自动更新
有很多这样的例子,包括开发工具中的数据绑定模板(实现基本notifypropertychanged行为),更好的方法是升级到MVVM light(http://mvvmlight.codeplex.com)或者更进一步的是像卡尔伯恩这样的(http://caliburnmicro.codeplex.com/)@HiTechMagic是的,这是一个有效的解决方案。确实如此,但通常最好将集合公开为只读属性以完全避免问题。@HiTechMagic是的,这是一个有效的解决方案。实际上,通常最好将集合作为只读属性公开,以完全避免问题。我需要将项目升级到mvvmlight以正确理解它。我需要将项目升级到mvvmlight以正确理解它。