c# - 当 Items Control 元素发生变化时如何处理?WPF, C#
问题描述
下面我有一个带有城市的 ListView,当检查城市时,第二个列表(带有人员)必须仅显示来自该城市的人员。
<ListView ItemsSource="{Binding Cities}">
<ListView.ItemTemplate >
<DataTemplate>
<StackPanel>
<Label Content="{Binding Name}" />
<CheckBox IsChecked="{Bidning IsChecked}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
第二个列表视图与人员:
<ListView ItemsSource="{Binding Persons}">
<ListView.ItemTemplate >
<DataTemplate>
<StackPanel>
<Label Content="{Binding Name}" />
<Label Content="{Bidning Surname}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您可以在下面看到带有与 ListViews 绑定的列表的视图模型。
public ListCollectionView Cities
{
get { return _cities; }
set
{
_cities = value;
RaisePropertyChanged();
}
}
public ListCollectionView Persons
{
get { return _persons; }
set
{
_persons= value;
RaisePropertyChanged();
}
}
问题是当用户选中 Cities ListView 内的复选框时如何处理,以便我可以刷新 Persons 列表并仅从选中的 City 返回 Persons?我不知道应该在 View Model 中写什么,所以当 ListView 子属性发生更改时我不知道如何处理。
解决方案
我建议处理 CheckBox 元素的 Checked 和 Unchecked 事件。
看法:
<ListView ItemsSource="{Binding Cities}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding CityName}" />
<CheckBox IsChecked="{Binding IsChecked}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding DataContext.SelectedCitiesChangedCommand, RelativeSource={RelativeSource AncestorType=ListView}}"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="{Binding DataContext.SelectedCitiesChangedCommand, RelativeSource={RelativeSource AncestorType=ListView}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView ItemsSource="{Binding ShownPeople}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<Label Content="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
视图模型:
public List<City> Cities { get; } = new List<City>();
public List<Person> Persons { get; } = new List<Person>();
public ObservableCollection<Person> ShownPeople { get; } = new ObservableCollection<Person>();
public ICommand SelectedCitiesChangedCommand { get; }
public ViewModel()
{
SelectedCitiesChangedCommand = new DelegateCommand(SelectedCitiesChanged);
}
private void SelectedCitiesChanged()
{
var checkedCities = Cities.Where(city => city.IsChecked);
ShownPeople.Clear();
ShownPeople.AddRange(Persons.Where(person => checkedCities.Any(city => city.CityName == person.City)));
}
推荐阅读
- javascript - 将对象用作 formState 时,角度表单 addControl 不起作用
- oracle - 更新 oracle 12 c 中归档的 NCHAR(2 CHAR) 时会自动添加空格/空格
- php - 在数组PHP中重复字符串x次数
- probability - 每支球队赢得淘汰赛的概率
- python - 有没有办法让函数等待图像显示,然后使用 PyAutoGui (Python) 在显示时单击图像
- php - 504 错误:无法满足请求
- python - How to combine 2 columns in pandas DataFrame?
- reactjs - React Native ToDo 应用程序:在 Andriod 上本地存储 ToDo 项目
- java - 如何使用自定义 JDK 构建 Jenkins 项目?
- php - php graph api访问令牌过期