单击背景,在ListBox中选择一个CheckBox

时间:2015-01-30 21:08:35

标签: c# wpf xaml checkbox listbox

我的ListBox有一点问题 我可以点击文字检查CheckBox
但如果我点击背景,我就无法检查CheckBox 这让我感觉很糟糕......

我想我可以创建一种方法来解决我的问题,
但我想知道是否有财产可以轻松解决这个问题 谢谢你的帮助。

<ListBox x:Name="DeleteEntreesListBox">
    <CheckBox x:Name="myTextBox" Content="Hello"/>
</ListBox>

如果我的光标在文本上,则该框为灰色且可以检查。 Screen
如果我的光标不在文本上但在背景上,则该框为白色,无法检查Screen

编辑:似乎没有财产可以解决这个问题 那么我怎么能用OnMouseLeftButtonDown来处理它呢 通过左键选择的项目必须将框设置为检查..

1 个答案:

答案 0 :(得分:1)

尝试设置与列表框(或任何其他父级)相同的宽度

<ListBox x:Name="DeleteEntreesListBox">
    <CheckBox x:Name="myTextBox" Content="Hello" Width="{Binding ActualWidth,ElementName=DeleteEntreesListBox}"/>
</ListBox>

*编辑

您可以将IsChecked绑定到祖先ListBoxItem的IsSelected属性。

<CheckBox x:Name="myTextBox2" Content="Hello" 
          IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, 
          AncestorType={x:Type ListBoxItem}}, 
          Path=IsSelected}"/>

或者,您可以更灵活地使用IValueConverter并传入标识符SelectedIndex等标识符+ ConverterParameter匹配int并转换为{{ 1}}如果匹配(或任何其他标识符)。

true

请注意,您需要在xaml中引用它,以便将int作为参数传递:

<ListBox x:Name="DeleteEntreesListBox">
    <CheckBox x:Name="myTextBox1" Content="Hello">
        <CheckBox.IsChecked>
            <Binding Path="SelectedIndex" ElementName="DeleteEntreesListBox" Converter="{StaticResource IndexToBoolConverter}">
                <Binding.ConverterParameter>
                    <sys:Int32>0</sys:Int32>
                </Binding.ConverterParameter>
            </Binding>
        </CheckBox.IsChecked>
    </CheckBox>
</ListBox>

并且转换器可以是这样的:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

虽然我认为你应该创建一个继承自class IndexToBoolConverter : IValueConverter { #region IValueConverter Members object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (parameter != null && (int)value == (int)parameter) { return true; } else return false; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if ((bool)value == true) return false; else return true; } #endregion } 的自己的UserControl,然后根据需要进行修改。