我有一个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?)
答案 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}" />