在 ItemTemplate 中使用 RadioButton 的 WPF ListView 选择
WPF ListView Selection with RadioButton in ItemTemplate
我使用 MVVM Light (WPF)。
我想在 ListView 中构建一个样式为 ToggleButtons 的复选框菜单,并根据选中的复选框在 contentcontrol 中显示一些控件。我已将 ListView 的 ItemSource 设置为 ObservableCollection<ViewModelInfo>
,其中 ViewModelInfo
对象保存有关要显示的 ViewModel 和 View 的信息。列表视图的 SelectedItem
我已绑定到 ViewModel 上的 SelectedViewModelInfoItem
属性。 SelectedViewModelInfoItem
属性 将从 selected ViewModelInfo
项中获取信息并设置正确的内容控件。
<ListView Grid.Column="0" Grid.Row="0" Grid.RowSpan="10"
ItemsSource="{Binding LeftPaneViewModelInfoItems}"
Background="Transparent" SelectedItem="{Binding SelectedViewModelInfoItem}">
<ListView.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Text}"
Style="{StaticResource RadioButtonToggleButtonStyle}"
GroupName="DisplayPage"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我看到的问题是 ListView 的 selection 似乎与 RadioButtons 选中状态完全分开,所以我必须单击切换按钮旁边的 select 我也明白了来自 ListView 的覆盖颜色。
问题: 如何最简单地将我的 ViewModeInfo
集合显示为切换按钮列表,确保我只看到切换按钮列表(而不是来自ListView) 仍然确保 selected(选中的切换按钮)设置为 SelectedViewModelInfoItem
.
我应该提到我已经探索了 EventToCommand
,将 Radiobutton 的 Checked 事件绑定到 ViewModel 上的 RelayCommand。如果我可以将实际的 ViewModelItem 作为事件参数而不是默认的 EventArgs(哪个来源是单选按钮),它就会起作用。我无法那样解决它,但如果有办法将 ViewModelItem 作为 eventarg,那可能是一个不错的解决方案。
您可以将 ListViewItem
的 IsSelected
属性 绑定到 RadioButton
的 IsChecked
属性 来实现此目的。喜欢,
<ListView Grid.Column="0" Grid.Row="0" Grid.RowSpan="10"
ItemsSource="{Binding LeftPaneViewModelInfoItems}"
Background="Transparent" SelectedItem="{Binding SelectedViewModelInfoItem}">
<ListView.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Text}"
Style="{StaticResource RadioButtonToggleButtonStyle}"
GroupName="DisplayPage"
IsChecked="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如果您想完全删除选择背景颜色,可以使用下面的 ItemContainerStyle
和上面的更改。
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
我使用 MVVM Light (WPF)。
我想在 ListView 中构建一个样式为 ToggleButtons 的复选框菜单,并根据选中的复选框在 contentcontrol 中显示一些控件。我已将 ListView 的 ItemSource 设置为 ObservableCollection<ViewModelInfo>
,其中 ViewModelInfo
对象保存有关要显示的 ViewModel 和 View 的信息。列表视图的 SelectedItem
我已绑定到 ViewModel 上的 SelectedViewModelInfoItem
属性。 SelectedViewModelInfoItem
属性 将从 selected ViewModelInfo
项中获取信息并设置正确的内容控件。
<ListView Grid.Column="0" Grid.Row="0" Grid.RowSpan="10"
ItemsSource="{Binding LeftPaneViewModelInfoItems}"
Background="Transparent" SelectedItem="{Binding SelectedViewModelInfoItem}">
<ListView.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Text}"
Style="{StaticResource RadioButtonToggleButtonStyle}"
GroupName="DisplayPage"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我看到的问题是 ListView 的 selection 似乎与 RadioButtons 选中状态完全分开,所以我必须单击切换按钮旁边的 select 我也明白了来自 ListView 的覆盖颜色。
问题: 如何最简单地将我的 ViewModeInfo
集合显示为切换按钮列表,确保我只看到切换按钮列表(而不是来自ListView) 仍然确保 selected(选中的切换按钮)设置为 SelectedViewModelInfoItem
.
我应该提到我已经探索了 EventToCommand
,将 Radiobutton 的 Checked 事件绑定到 ViewModel 上的 RelayCommand。如果我可以将实际的 ViewModelItem 作为事件参数而不是默认的 EventArgs(哪个来源是单选按钮),它就会起作用。我无法那样解决它,但如果有办法将 ViewModelItem 作为 eventarg,那可能是一个不错的解决方案。
您可以将 ListViewItem
的 IsSelected
属性 绑定到 RadioButton
的 IsChecked
属性 来实现此目的。喜欢,
<ListView Grid.Column="0" Grid.Row="0" Grid.RowSpan="10"
ItemsSource="{Binding LeftPaneViewModelInfoItems}"
Background="Transparent" SelectedItem="{Binding SelectedViewModelInfoItem}">
<ListView.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Text}"
Style="{StaticResource RadioButtonToggleButtonStyle}"
GroupName="DisplayPage"
IsChecked="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如果您想完全删除选择背景颜色,可以使用下面的 ItemContainerStyle
和上面的更改。
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>