动态设置 ListBox CheckBox 内容
Posted
技术标签:
【中文标题】动态设置 ListBox CheckBox 内容【英文标题】:Set ListBox CheckBox Content dynamically 【发布时间】:2022-01-02 01:41:38 【问题描述】:我有一个 WPF 用户控件,它是一个包含 CheckBox
es 的 ListBox
。
<UserControl x:Class="AC.CodA.WPF.UserControls.CheckedListBox"
x:Name="Root"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:Background="White">
<StackPanel>
<ListBox BorderThickness="0"
ItemsSource="Binding ElementName=Root, Path=ItemsSource">
<ListBox.ItemContainerStyle>
<Style TargetType="x:Type ListBoxItem">
<Setter Property="Focusable"
Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="Binding IsChecked"
Content="Binding Item">
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Separator />
<CheckBox x:Name="DeSelectAll"
Content="Select / deselect all"
Checked="DeSelectAll_Checked"
Unchecked="DeSelectAll_Unchecked" />
</StackPanel>
</UserControl>
我在另一个地方使用这个控件:
<GroupBox Header="Binding ElementName=Root, Path=Header, FallbackValue=Header">
<user:CheckedListBox ItemsSource="Binding ElementName=Root, Path=Companies" />
</GroupBox>
在这个地方,Companies
属性是一个ObservableCollection<CheckedListBoxItem<Company>>
。
CheckedListBoxItem
是一个具有bool IsChecked
属性和通用T Item
属性的类。
现在,T Item
可以是任何东西。此时我将此属性设置为CheckBox
的Content
,但大多数情况下这会导致类似AC.CodA.Scripting.Shared.Company
的模棱两可。
有没有办法在用户控件之外设置CheckBox
Content
?像CheckBoxContent
这样的东西:
<GroupBox Header="Binding ElementName=Root, Path=Header, FallbackValue=Header">
<user:CheckedListBox ItemsSource="Binding ElementName=Root, Path=Companies" CheckBoxContent="Binding Item.Name" />
</GroupBox>
在我的对象内部:
<CheckBox IsChecked="Binding IsChecked"
Content="Binding CheckBoxContent">
</CheckBox>
【问题讨论】:
【参考方案1】:将CheckBoxContent
dependency property 添加到您的UserControl
的代码隐藏文件中:
public partial class CheckedListBox : UserControl
...
public static readonly DependencyProperty CheckBoxContentProperty =
DependencyProperty.Register(nameof(CheckBoxContent), typeof(object),
typeof(CheckedListBox));
public object CheckBoxContent
get return GetValue(CheckBoxContentProperty);
set SetValue(CheckBoxContentProperty, value);
...并在您的 XAML 标记中绑定到它:
<CheckBox IsChecked="Binding IsChecked"
Content="Binding CheckBoxContent,
RelativeSource=RelativeSource AncestorType=UserControl">
</CheckBox>
【讨论】:
Tnx 回复。我已经按照您的建议完成了此操作,但是在使用CheckedListBox
时,我现在如何填写此 CheckBoxContent
?以类Company
为例,其属性为Name
。我尝试了以下但内容为空:<user:CheckedListBox ItemsSource="Binding ElementName=Root, Path=Companies" CheckBoxContent="Binding Name" />
.
如果将属性设置为常量字符串值是否有效,例如:CheckBoxContent="test"
?然后绑定到Name
失败。
Tnx 寻求帮助,但该项目已继续进行并决定使用另一种方法。很抱歉浪费了您的时间。以上是关于动态设置 ListBox CheckBox 内容的主要内容,如果未能解决你的问题,请参考以下文章
背水一战 Windows 10 (33) - 控件(选择类): ListBox, RadioButton, CheckBox, ToggleSwitch
背水一战 Windows 10 (33) - 控件(选择类): ListBox, RadioButton, CheckBox, ToggleSwitch
如何在 WPF CheckBox ListBox 中获取选定项目
如果我单击对话框中的项目(ListBox、CheckBox 等),则不会触发 OnLButtonDown(),但如果单击背景或静态文本,它会触发