gpt4 book ai didi

WPF ListBox ListBoxItem 绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 14:11:06 25 4
gpt4 key购买 nike

我正在阅读 Sams 的书“在 24 小时内自学 WPF”。在某一时刻,作者展示了如何将 ListBox 的选定项值绑定(bind)到属性。我明白了,这很简单。但是当我尝试用我自己的 ListBoxItems 创建我自己的 ListBox 控件时,我似乎无法让它工作。

有效的 ListBox 使用系统集合作为其 ItemsSource 属性:

<ListBox x:Name="FontList"
DockPanel.Dock="Left"
ItemsSource="{x:Static Fonts.SystemFontFamilies}"
Width="160" />

从此 ListBox 中选择的值随后在 TextBlock 中使用,如下所示:
<TextBlock Text="Test" 
FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
TextWrapping="Wrap"
Margin="0 0 0 4" />

请注意,Path 设置为 SelectedItem。

现在,我想使用另一个包含 3 种不同大小的 ListBox 来设置 FontSize。这是我所做的:
<ListBox x:Name="Size" >
<ListBoxItem>10</ListBoxItem>
<ListBoxItem>15</ListBoxItem>
<ListBoxItem>20</ListBoxItem>
</ListBox>

然后我为 TextBox 的 Size 属性添加了一个绑定(bind),如下所示:
<TextBlock Text="Test" 
FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
Size="{Binding ElementName=Size, Path=SelectedItem}"
TextWrapping="Wrap"
Margin="0 0 0 4" />

运行程序时大小不会改变。因此,我尝试将我用于 Size 的绑定(bind)添加到 Text 属性——以便查看它的值:
<TextBlock Text="{Binding ElementName=Size, Path=SelectedItem}"" 
FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
Size="{Binding ElementName=Size, Path=SelectedItem}"
TextWrapping="Wrap"
Margin="0 0 0 4" />

当我单击 Size ListBox 时,我看到它正在发生变化,但我还看到 SelectedItem 显示为这样(当我单击 15 条目时):
System.Windows.Controls.ListBoxItem:15

我的问题:
1) 名为 SelectedItem 的路径返回的实际值是多少?是“System.Windows.Controls.ListBoxItem:15”还是“15”?如果不是 15,我如何指定只返回 15 而不是 System.Windows.Controls.ListBoxItem:15 的路径?

2) 为什么 FontFamily SelectItem 有效?我意识到 FontList 来自字体名称的系统集合,但我不清楚为什么 ListBox 没有将 ListBoxItems 集合作为文本返回。如果我的 ListBox 的路径引用返回 ListBoxItem 类型的 SelectedItem 对象,那么我想我可以使用 SelectedItem.Value 的路径或类似的东西——但它不起作用,并且没有 Intellisense 可以帮助我。

我想让这个例子工作,因为它有助于消除我的一些误解。请不要重构解决方案以使其以其他方式工作,除非我完全不可能拥有一个 Path 引用,它只会给我选择的 Size ListBoxItem 的数字部分。

最佳答案

What is the actual value being returned by the Path called SelectedItem?



System.Windows.Controls.ListBoxItem:15 (您可以将其读作“内容设置为 15 的 ListBoxItem”),这就是您的绑定(bind)不起作用的原因 - 它需要一个数值,而不是 ListBoxItem .您可以指定 PathSelectedItem.Content使这项工作。也可以设置 SelectedValuePath将列表框“大小”转换为“内容”,并绑定(bind)到 SelectedValue属性而不是 SelectedItem .

解决方案1:
<TextBlock Size="{Binding ElementName=Size, Path=SelectedItem.Content}" />

解决方案2:
<ListBox x:Name="Size" SelectedValuePath="Content" />
<TextBlock Size="{Binding ElementName=Size, Path=SelectedValue}" />

Why does the FontFamily SelectItem work?



因为该 ListBox 包含一个字体集合,而不是 ListBoxItems 的集合(尽管它们仍然被创建以表示集合中的每个项目)。如果您在代码中定义字体大小集合并将 ListBox 的 ItemsSource 属性绑定(bind)到该集合或将 ListBox 的内容定义为 System.Double 的集合,则可以使用字体大小实现相同的行为。直接在 XAML 中的值:
<ListBox x:Name="Size"
xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:Double>10</system:Double>
<system:Double>15</system:Double>
<system:Double>20</system:Double>
</ListBox>

关于WPF ListBox ListBoxItem 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com