首页 > 解决方案 > 当 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 子属性发生更改时我不知道如何处理。

标签: c#wpflistviewbindingviewmodel

解决方案


我建议处理 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)));
}

推荐阅读