Select 通过单击背景在 ListBox 中创建 CheckBox
Select a CheckBox in a ListBox by clicking on the background
我的ListBox
有点问题
我可以通过单击文本来查看 CheckBox
,
但是如果我点击背景,我无法检查我的 CheckBox
这让我感觉很糟糕...
我想我可以创建一个方法来解决我的问题,
但我想知道是否有 属性 可以轻松解决此问题。
感谢您的帮助。
<ListBox x:Name="DeleteEntreesListBox">
<CheckBox x:Name="myTextBox" Content="Hello"/>
</ListBox>
如果我的光标在文本上,该框是灰色的,可以检查。
Screen
如果我的光标不在文本上而是在背景上,则该框为白色且无法检查 Screen
编辑:似乎没有 属性 可以解决这个问题。
那么我该如何处理,例如 OnMouseLeftButtonDown
.
左键选择的项目必须勾选..
尝试将宽度设置为与列表框(或任何其他父项)相同
<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
+ 具有匹配 int
的 ConverterParameter
并转换为true
如果它们匹配(或任何其他标识符)。
<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>
请注意,您需要在 xaml 中引用它,以便将 int 作为参数传递:
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
自己的继承自 ListBox
并根据需要进行修改。
我的ListBox
有点问题
我可以通过单击文本来查看 CheckBox
,
但是如果我点击背景,我无法检查我的 CheckBox
这让我感觉很糟糕...
我想我可以创建一个方法来解决我的问题,
但我想知道是否有 属性 可以轻松解决此问题。
感谢您的帮助。
<ListBox x:Name="DeleteEntreesListBox">
<CheckBox x:Name="myTextBox" Content="Hello"/>
</ListBox>
如果我的光标在文本上,该框是灰色的,可以检查。
Screen
如果我的光标不在文本上而是在背景上,则该框为白色且无法检查 Screen
编辑:似乎没有 属性 可以解决这个问题。
那么我该如何处理,例如 OnMouseLeftButtonDown
.
左键选择的项目必须勾选..
尝试将宽度设置为与列表框(或任何其他父项)相同
<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
+ 具有匹配 int
的 ConverterParameter
并转换为true
如果它们匹配(或任何其他标识符)。
<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>
请注意,您需要在 xaml 中引用它,以便将 int 作为参数传递:
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
自己的继承自 ListBox
并根据需要进行修改。