Как справиться, когда элемент управления элементов изменился? WPF, C# - PullRequest
0 голосов
/ 23 января 2020

Ниже у меня есть 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, проверяется пользователем, поэтому я могу переосмыслить sh список людей и вернуть людей только из отмеченного города? Я не знаю, что мне писать в View Model, поэтому я не знаю, как обращаться с измененным свойством потомков ListView.

Ответы [ 3 ]

0 голосов
/ 23 января 2020

Обработка SelectedItem хороша, но только если я хочу выбрать только один Город из списка. Что если я хочу выбрать более одного?

Я пытался обработать свойство IsChecked внутри класса Cities, но в классе Cities у меня нет доступа к другим элементам, которые находятся в View Model, где есть Cities List и Person list.

0 голосов
/ 23 января 2020

Я рекомендую обрабатывать событие Checked and Unchecked элементов CheckBox.

Просмотр:

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

ViewModel:

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)));
}
0 голосов
/ 23 января 2020

Вы должны добавить свойство public City SelectedCity к модели представления и связать выбранное значение города в представлении

<ListView ItemsSource="{Binding Cities}" SelectedItem="{Binding SelectedCity">

в установщике SelectedCity, вы можете обновить коллекцию Persons как

class PersonsByCitiesViewModel
{
public City SelectedCity
{
get{}
set
{
  Persons = LoadPersons(value);
}
}

public ListCollectionView LoadPersons(City selected)
{
  var persons = LoadAll();
  if (selected != null)
    persons = persons.Where(_ => _.CityId = selected.CityId);
  return new ListCollectionView(persons);
}
}
...