wpf:根据选中的单选按钮更改Listview的样式

时间:2012-07-15 10:29:01

标签: .net wpf wpf-controls

我有一个Listview和一组radiobutton(两个radiobutton)。我想根据我检查的单选按钮更改ListView的样式和ListViewItem的样式。如果可能,我会避免代码隐藏。

Radiobutton 1 - > ListView显示ListStyle1,ListViewItem显示ItemStyle1 Radiobutton 2 - > ListView显示ListStyle2,ListViewItem显示ItemStyle2

我发现了一个使用组合框代替radiobuttons的类似例子,但我不能在我的情况下使用它,因为我不能引用“选定项目”。 (Can I dynamically switch between styles in WPF?

2 个答案:

答案 0 :(得分:0)

看起来很糟糕,但我推荐一个列表(重新定义他们的样式和模板)来模拟样式的选择。

您可以使用(或类似的)来定义元素的组织:

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel  Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <RadioButton IsChecked="{Binding Mode=TwoWay, Path=IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem, Mode=FindAncestor}}">
                    <TextBlock Text="{Binding StyleName}"/>
                </RadioButton>
            </DataTemplate>
        </ListBox.ItemTemplate>

所以你只需要为ItemsSource创建一个自定义类。除了自定义绑定SelectedValue或SelectedItem。

答案 1 :(得分:0)

为什么不使用DataTrigger根据选中RadioButton设置样式?

<Style x:Key="MyListViewStyle" TargetType="{x:Type ListView}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=RadioButton1, Path=IsChecked}" Value="True">
            <!-- Your Style Setters here -->
            <Setter PropertyName="ItemTemplate" Value="{StaticResource ItemTemplate1}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding ElementName=RadioButton2, Path=IsChecked}" Value="True">
            <!-- Your Style Setters here -->
            <Setter PropertyName="ItemTemplate" Value="{StaticResource ItemTemplate2}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

也就是说,将ListBox设置为RadioButtons的列表非常容易。当我想显示包含RadioButtons的项目列表但仍希望保持ListBox选择行为时,我经常这样做。

<Style x:Key="RadioButtonListBoxStyle" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2, 2, 2, 0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border Background="Transparent">
                                <RadioButton
                                    Content="{TemplateBinding ContentPresenter.Content}" VerticalAlignment="Center"
                                    IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

使用示例:

<ListBox ItemsSource="{Binding MyOptions}"
         SelectedItem="{Binding SelectedOption}"
         Style="{StaticResource RadioButtonListBoxStyle}" />