[英]Bind ListView to ObservableCollection and Linq
嗨,我正在尝试将 ListView 绑定到 Linq,并使其对集合中的更改做出反应。
public partial class MainWindow
{
readonly ObservableCollection<Person> _persons = new ObservableCollection<Person>();
readonly Team _team1 = new Team { Name = "Team 1" };
readonly Team _team2 = new Team { Name = "Team 2" };
readonly Team _team3 = new Team { Name = "Team 3" };
public MainWindow()
{
InitializeComponent();
_persons.Add(new Person {Name = "James", Team = _team1});
_persons.Add(new Person {Name = "John", Team = _team2});
_persons.Add(new Person {Name = "Peter", Team = _team3});
_persons.Add(new Person {Name = "Jack", Team = _team1});
_persons.Add(new Person {Name = "Jones", Team = _team2});
_persons.Add(new Person {Name = "Bauer", Team = _team3});
_persons.Add(new Person {Name = "Bo", Team = _team1});
_persons.Add(new Person {Name = "Ben", Team = _team2});
_persons.Add(new Person {Name = "Henry", Team = _team3});
TeamList1.ItemsSource = from person in _persons where person.Team == _team1 select person;
TeamList2.ItemsSource = from person in _persons where person.Team == _team2 select person;
TeamList3.ItemsSource = from person in _persons where person.Team == _team3 select person;
}
private void ButtonClick(object sender, RoutedEventArgs e)
{
_persons[0].Team = _team2;
}
}
还有我的模特
public class Person : INotifyPropertyChanged
{
private string _name;
public String Name
{
get { return _name; }
set { _name = value; NotifyPropertyChanged("Name"); }
}
private Team _team;
public Team Team
{
get { return _team; }
set { _team = value; NotifyPropertyChanged("Team"); }
}
public override string ToString()
{
return string.Format("Name {0}\t{1}", Name, Team);
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
public class Team : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; NotifyPropertyChanged("Name"); }
}
public override string ToString()
{
return Name;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
和 Xaml
<Grid>
<StackPanel Orientation="Vertical">
<StackPanel>
<ListView Name="TeamList1"/>
<ListView Name="TeamList2"/>
<ListView Name="TeamList3"/>
</StackPanel>
<Button Content="Click Me" Click="ButtonClick"/>
</StackPanel>
</Grid>
当调用 ButtonClick 时,我希望我的 ListView 反映它对 _persons 所做的更改。
只是不要使用 linq,这类东西有CollectionViews有过滤器,然后你只需要刷新视图(请参阅:如何:在视图中过滤数据)。 (如果您必须使用 linq,还有可绑定的扩展)
LINQ 查询在绑定到数据源并生成列表视图中的项目时进行评估。 每当您更改原始列表_persons
人员的属性时,都不会重新评估 LINQ 查询。 要实现这一点,您必须执行一个自定义实现来侦听原始列表中每个Person
的PropertyChanged
事件并相应地更新ObservableCollection<Person>
。 您将绑定到列表视图的这个 observable 集合。
你需要我的ObservableComputations库。 使用这个库,你可以这样编码:
TeamList1.ItemsSource = _persons.Filtering(person.Team == _team1);
TeamList2.ItemsSource = _persons.Filtering(person.Team == _team2);
TeamList3.ItemsSource = _persons.Filtering(person.Team == _team3);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.