如何从对象集合中设置 listView 中的选定项

How to set selected item(s) in a listView from a collection of an object

我正在使用 ListView 设置一个 WPF 控件,它显示我的模型中存在的 class 对象(此处 - AllSettingsCollection<MySettings>)的可观察集合中的项目列表。其中 MySettings 是 class,其中包含一些硬件设置。

我可以将列表视图的 ItemSource 设置为

ItemsSource="{Binding  Model.AllSettingsCollection}"

并使用 DataTemplate(下面的代码)在每一行中显示名称 但我无法根据 IsSelected 属性.

设置每行的选定 属性

假设 class (MySettings) 如下

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

此 class 的对象在集合 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。

如果是 ListView,我可以在哪里设置每一行的 isSelected 属性,所以理想情况下我可以有一个像

这样的语句
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>

它获取每一行并根据集合中对象的 IsSelected 属性 将其标记为选中或未选中。

注意:我还想让每一行 isSelected 都有一个更改事件,如果用户更改了选择的项目集,它会响应,但这是我稍后会看到的内容。

将 Setter 移动到 ItemContainerStyle:

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

并确保源 属性 的类型为 bool 并且具有触发更改通知的 public setter:

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)));
       }
    }
}