关注gehho's answer to "MVVM Group Radio Button"我正在尝试向列表项添加单选按钮,以便在选择列表项时选中单选按钮,当未选择列表项时,将取消选中单选按钮。凯利有a great answer他或她的“绑定RadioButton IsChecked到ListBoxItem IsSelected和ListBox IsFocused”问题看起来应该做我需要的。然而,我对Kelly的XAML的简单转换不起作用 - 单选按钮仍未选中。这是我的MainWindow.xaml
的全部内容<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.SampleDataSource"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="RadioButton.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Window.Resources>
<SampleData:SampleDataSource x:Key="SampleDataSource" d:IsDataSource="True"/>
<ControlTemplate x:Key="LBItemControlTemplate" TargetType="{x:Type ListBoxItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock TextWrapping="Wrap" Text="{Binding Property1}" Grid.Column="1"/>
<RadioButton x:Name="rbIsSelected" IsChecked="False" IsEnabled="False"/>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
<Condition Property="Selector.IsSelectionActive" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="IsChecked" TargetName="rbIsSelected" Value="True"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<DataTemplate x:Key="ListBoxItemTemplate">
<ListBoxItem Template="{StaticResource LBItemControlTemplate}"/>
</DataTemplate>
</Window.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
<ListBox ItemsSource="{Binding Collection}" ItemTemplate="{DynamicResource ListBoxItemTemplate}" SelectionMode="Single"/>
</Grid>
</Window>
任何人都可以看到为什么这不起作用并建议修复或不同的方法?
答案 0 :(得分:1)
您知道ItemsControls
会为找到的每个数据项自动创建一个Container项吗?您的DataTemplate
包含一个永远不正确的ListBoxItem
。你基本上说“当你在ListBoxItem中显示我的内容时,创建一个新的ListBoxItem”。因此,您的代码依赖于分离的ListBoxItem
,它永远不会被选中,因为它不是ItemsControl
中的容器项,因此它无法工作。您的DataTemplate
只是Container中的内容,在这种情况下,DataTemplate应该定义您的数据在ListBoxItem
中的外观。
这是一个很小但并非必要的好习惯示例,但它表明您不必创建ListBoxItem
,它会自动出现在:
作为资源的某个地方,例如Window.Resources或app.xaml:
<DataTemplate x:Key="myTemplate">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"/>
<TextBlock Text="{Binding}"/>
</StackPanel>
</DataTemplate>
用法本身
<ListBox x:Name="test" ItemTemplate="{StaticResource myTemplate}"/>
在这种情况下,列表框需要在后面的代码中设置ItemsSource。