Как установить выбранный элемент (ы) в listView из коллекции объекта - PullRequest
0 голосов
/ 28 октября 2019

Я настраиваю элемент управления WPF с помощью ListView, который отображает список элементов из наблюдаемой коллекции объектов класса (здесь - AllSettingsCollection<MySettings>), присутствующей в моей модели. Где MySettings - это класс, который содержит некоторые аппаратные настройки.

Я могу установить ItemSource представления списка как

ItemsSource="{Binding  Model.AllSettingsCollection}"

и отображать имя в каждой строке, используя DataTemplate (кодниже), но я не могу установить выбранное свойство каждой строки на основе свойства IsSelected.

Предположим, что класс (MySettings) такой же, как ниже

public class MySettings
{
  public string Name{get; private set;}
  public string IsSelected{get; private set;}
}

и объекты этого классанаходятся в коллекции AllSettingsCollection, которая является ObservableCollection<MySettings>

Теперь, если я настрою свой ListView, как показано ниже

<ListView
      Grid.Row="0"
      HorizontalContentAlignment="Stretch"
      ItemsSource="{Binding Model.AllSettingsCollection}"
      SelectionMode="Multiple"
      Style="{StaticResource ListViewStyle}">
      <ListView.View>
        <GridView AllowsColumnReorder="False">
          <GridViewColumn
            DisplayMemberBinding="{Binding Name}"
            Header="Settings:" >
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <TextBlock HorizontalAlignment="Stretch" Text="{Binding}" />
              </DataTemplate>
            </GridViewColumn.CellTemplate>
          </GridViewColumn>
          <GridView.ColumnHeaderContainerStyle>
            <Style BasedOn="{StaticResource NonResizableGridViewColumnHeaderStyle}" TargetType="{x:Type GridViewColumnHeader}">
            </Style>
          </GridView.ColumnHeaderContainerStyle>
        </GridView>
      </ListView.View>
      <ListView.ItemContainerStyle>
        <Style BasedOn="{StaticResource ListViewItemStyle}" TargetType="{x:Type ListViewItem}">
        </Style>
      </ListView.ItemContainerStyle>
    </ListView>

, так как мой ListView.ItemsSource является Model.AllSettingsCollection, я могугенерировать каждую строку с именем. но я не могу найти, где я могу установить свойство IsSelected каждой строки.

Где я могу установить свойство isSelected каждой строки, если ListView, поэтому в идеале я мог бы иметь такой оператор, как

<Setter Property="IsSelected" Value="{Binding IsSelected}"/>

, который берет каждую строку и помечает ее как выбранную или не основаннуюо свойстве IsSelected объекта в коллекции.

Примечание. Я также хотел бы, чтобы в каждой строке isSelected было событие change, которое реагирует на изменение пользователем выбранного набора элементов, но этото, на что я посмотрю позже.

1 Ответ

0 голосов
/ 28 октября 2019

Переместите установщик в ItemContainerStyle:

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
    </Style>
</ListView.ItemContainerStyle>

И убедитесь, что свойство источника имеет тип bool и имеет открытый установщик, который запускает уведомление об изменении:

public class MySettings : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name { get; private set; }

    private bool isSelected;
    public bool IsSelected
    {
       get { return isSelected; }
       set
       {
           isSelected = value;
           PropertyChanged?.Invoke(this,
               new PropertyChangedEventArgs(nameof(IsSelected)));
       }
    }
}
...