使用ItemTemplate

时间:2018-08-15 10:06:41

标签: wpf mvvm binding styles mvvm-light

我使用MVVM Light(WPF)。 我想在ListView中构建样式为ToggleButtons的复选框菜单,并根据要选中的复选框在contentcontrol中显示一些控件。我已将ListView的ItemSource设置为ObservableCollection<ViewModelInfo>,其中ViewModelInfo对象保存有关要显示的ViewModel和View的信息。列表视图的SelectedItem我已绑定到ViewModel的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>

我看到的问题是ListView的选择似乎与RadioButtons选中的状态完全分开,因此我必须单击切换按钮旁边的按钮来选择它,同时我也会从ListView中获得覆盖色。

问题:如何最轻松地将我的ViewModeInfo集合显示为切换按钮列表,确保我只能看到切换按钮列表(而不是ListView中的高亮显示)确保所选(选中的切换按钮)设置为SelectedViewModelInfoItem

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

1 个答案:

答案 0 :(得分:1)

您可以将IsSelected的{​​{1}}属性绑定到ListViewItem的{​​{1}}属性以实现此目的。就像

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>