ItemTemplate 中带有 RadioButton 的 WPF ListView 选择

Joh*_*han 3 wpf binding styles mvvm mvvm-light

我使用 MVVM Light (WPF)。我想在 ListView 中构建一个样式为 ToggleButtons 的复选框菜单,并根据选中的复选框在内容控件中显示一些控件。ListView中我的的ItemSource已设置为ObservableCollection<ViewModelInfo>ViewModelInfo对象持有约视图模型和视图的信息显示。SelectedItem我已将列表视图绑定到SelectedViewModelInfoItemViewModel 上的一个属性。该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>
Run Code Online (Sandbox Code Playgroud)

我看到的问题是 ListView 的选择似乎与 RadioButtons 选中状态完全分开,所以我必须单击切换按钮旁边的按钮来选择它,我还从 ListView 获得了覆盖颜色。

问题:我如何最简单地将我的集合显示ViewModeInfo为切换按钮列表,以确保我只看到一个切换按钮列表(不是 ListView 中的突出显示覆盖),但仍确保所选(选中的切换按钮)设置为SelectedViewModelInfoItem.

我应该提到我已经探索了EventToCommand将 Radiobutton 的 Checked 事件绑定到 ViewModel 上的 RelayCommand。如果我可以将实际的 ViewModelItem 作为事件参数而不是默认的 EventArgs(源是单选按钮),它会起作用。我无法以这种方式解决它,但是如果有一种方法可以将 ViewModelItem 作为 eventarg,它可能是一个不错的解决方案。

dhi*_*thy 5

您可以将 的IsSelected属性绑定ListViewItem到 的IsChecked属性RadioButton来实现此目的。喜欢,

<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>
Run Code Online (Sandbox Code Playgroud)

如果您想完全删除选择背景颜色,您可以在下面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>
Run Code Online (Sandbox Code Playgroud)