在列表视图中单击自定义控件上的事件并不总是设置SelectedItem

时间:2016-05-10 14:06:56

标签: c# wpf xaml

我的情况是我有一个列表视图:

<ListView ItemsSource="{Binding Environments}" SelectedItem="{Binding SelectedEnvironment}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <controls:RadioButtonTextBox DataContext="{Binding}"/>
         </DataTemplate>
     </ListView.ItemTemplate>
 </ListView>

使用自定义控件作为项目模板:

<StackPanel Orientation="Horizontal">
    <RadioButton VerticalAlignment="Center">
        <RadioButton.IsChecked>
            <MultiBinding Converter="{converters:StringCompareToBooleanConverter}">
                <Binding Path="." RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=UserControl}"/>
                <Binding Path="SelectedItem" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListView}"/>
            </MultiBinding>
        </RadioButton.IsChecked>    
    </RadioButton>
    <TextBlock Text="{Binding}" VerticalAlignment="Center" Margin="5,0,0,0" Style="{DynamicResource RedTextBlock}"/>
</StackPanel>

我遇到的问题是,如果用户点击自定义控件的文本块,则会发生正确的事情,即选择项目(并且视图模型相应地更新),但是如果用户单击单选按钮自定义控件的单选按钮将被选中,但所选项目未更新,并且未取消选择先前选择的项目。

任何人都可以帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

单击处理,不会通过单选按钮传播。

如果项目包含输入元素,我倾向于将IsSelected中的ItemContainerStyle绑定到IsKeyboardFocusWithin。不确定这是否取消选择旧项目,可能仅在选择模式为Single

答案 1 :(得分:0)

我发现最简单的解决方案是将单选按钮上的启用标志设置为false:

 <StackPanel Orientation="Horizontal">
    <RadioButton VerticalAlignment="Center" IsEnabled="False">
        <RadioButton.IsChecked>
            <MultiBinding Converter="{converters:StringCompareToBooleanConverter}">
                <Binding Path="." RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=UserControl}"/>
                <Binding Path="SelectedItem" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListView}"/>
            </MultiBinding>
        </RadioButton.IsChecked>    
    </RadioButton>
    <TextBlock Text="{Binding}" VerticalAlignment="Center" Margin="5,0,0,0" Style="{DynamicResource RedTextBlock}"/>
</StackPanel>