我正在读Sams的书“24小时内自学WPF”。在这篇文章中,作者展示了如何将列表框的选定项值绑定到属性。我明白,这很简单。但是当我尝试用我自己的ListBoxItems创建我自己的ListBox控件时,我似乎不能让它工作。
起作用的ListBox使用系统集合作为其ItemsSource属性:
<ListBox x:Name="FontList"
DockPanel.Dock="Left"
ItemsSource="{x:Static Fonts.SystemFontFamilies}"
Width="160" />然后在TextBlock中使用从该ListBox中选择的值,如下所示:
<TextBlock Text="Test"
FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
TextWrapping="Wrap"
Margin="0 0 0 4" />请注意,路径设置为SelectedItem。
现在,我想使用另一个包含3种不同大小的ListBox来设置FontSize。下面是我所做的:
<ListBox x:Name="Size" >
<ListBoxItem>10</ListBoxItem>
<ListBoxItem>15</ListBoxItem>
<ListBoxItem>20</ListBoxItem>
</ListBox>然后,我向TextBox的Size属性添加了一个绑定,如下所示:
<TextBlock Text="Test"
FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
Size="{Binding ElementName=Size, Path=SelectedItem}"
TextWrapping="Wrap"
Margin="0 0 0 4" />当我运行程序时,大小不会改变。因此,我尝试将用于Size的绑定添加到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" />我看到它在我单击大小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集合作为文本返回。如果我的列表框的路径引用返回一个ListBoxItem类型的SelectedItem对象,那么我认为我可以使用SelectedItem.Value或类似的路径--但它不起作用,并且没有智能感知来帮助我。
我想让这个例子起作用,因为它将有助于澄清我的一些误解。请不要重构解决方案来让它以其他方式工作,除非我完全不可能有一个路径引用来给出我所选择的ListBoxItem大小的数字部分。
发布于 2012-03-18 06:17:41
名为SelectedItem的路径返回的实际值是多少?
它是System.Windows.Controls.ListBoxItem:15 (您可以将其读作"ListBoxItem with content set to 15"),这就是绑定不起作用的原因--它需要一个数字值,而不是ListBoxItem。您可以将Path指定为SelectedItem.Content以使其正常工作。您还可以将ListBox“SelectedValuePath”的大小设置为"Content",并绑定到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}" />为什么FontFamily SelectItem可以工作?
因为该ListBox包含一个字体集合,而不是ListBoxItems的集合(它们仍然是为了表示集合中的每一项而创建的)。如果在代码中定义字体大小的集合,并将列表框的ItemsSource属性绑定到该集合,或者直接在System.Double中将ListBox的内容定义为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>发布于 2012-03-18 06:34:06
1) SelectedItem绑定返回的实际值是一个ListBoxItem对象。要从绑定中获取值(15),您可以使用转换器或使绑定路径更显式,以获取列表框项目的内容属性值:
Size="{Binding ElementName=Size, Path=SelectedItem.Content}"2)这是一个协变操作,因此每个列表项的类型都是从它的源中推断出来的。字体系列项控件(ListBox)生成的项是它绑定到的集合的结果。Items属性(通过ItemsSource依赖属性填充)是泛型对象的ItemCollection,它采用其相应上下文对象的类型。
https://stackoverflow.com/questions/9754079
复制相似问题