如何从对象集合中设置 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)));
}
}
}
我正在使用 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)));
}
}
}