I use MVVM Light (WPF(. 我想在 ListView 中构建一个样式为 ToggleButton 的复选框菜单,并根据选中的复选框在内容控件中显示一些控件。列表视图的 ItemSource 我已设置为一个ObservableCollection<ViewModelInfo>
,其中ViewModelInfo
对象包含有关要显示的视图模型和视图的信息。列表视图的SelectedItem
我已绑定到视图模型上的SelectedViewModelInfoItem
属性。SelectedViewModelInfoItem
属性将从所选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>
我看到的问题是列表视图的选择似乎与单选按钮选中状态完全分开,所以我必须单击切换按钮旁边的选择它也从列表视图中获得覆盖颜色。
问题:如何最轻松地将我的ViewModeInfo
集合显示为切换按钮列表,确保我只看到切换按钮列表(而不是 ListView 中的突出显示叠加层(,但仍确保所选(选中切换按钮(设置为SelectedViewModelInfoItem
。
我应该提到我已经探索了EventToCommand
,将单选按钮的已检查事件绑定到视图模型上的中继命令。如果我可以将实际的 ViewModelItem 作为事件参数而不是默认的 EventArgs(哪个源是单选按钮(获取,它将起作用。我无法以这种方式解决它,但如果有办法将 ViewModelItem 作为事件参数,它可能是一个很好的解决方案。
您可以将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>