0

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

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

我发现了一个使用组合框而不是单选按钮的类似示例,但在我的情况下我无法使用它,因为我无法引用“选定项目”。(我可以在 WPF 中的样式之间动态切换吗?

4

2 回答 2

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。

于 2012-07-15T23:40:42.167 回答
0

为什么不使用 aDataTrigger来设置基于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>

也就是说,将 aListBox设置为显示为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}" />
于 2012-07-16T14:33:27.663 回答