首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ListBox ListBoxItem绑定

WPF ListBox ListBoxItem绑定
EN

Stack Overflow用户
提问于 2012-03-18 05:51:30
回答 2查看 7K关注 0票数 4

我正在读Sams的书“24小时内自学WPF”。在这篇文章中,作者展示了如何将列表框的选定项值绑定到属性。我明白,这很简单。但是当我尝试用我自己的ListBoxItems创建我自己的ListBox控件时,我似乎不能让它工作。

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

代码语言:javascript
复制
<ListBox x:Name="FontList"
         DockPanel.Dock="Left"
         ItemsSource="{x:Static Fonts.SystemFontFamilies}"
         Width="160" />

然后在TextBlock中使用从该ListBox中选择的值,如下所示:

代码语言:javascript
复制
<TextBlock Text="Test" 
           FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
           TextWrapping="Wrap"
           Margin="0 0 0 4" />

请注意,路径设置为SelectedItem。

现在,我想使用另一个包含3种不同大小的ListBox来设置FontSize。下面是我所做的:

代码语言:javascript
复制
<ListBox x:Name="Size" >
    <ListBoxItem>10</ListBoxItem>
    <ListBoxItem>15</ListBoxItem>
    <ListBoxItem>20</ListBoxItem>
</ListBox>

然后,我向TextBox的Size属性添加了一个绑定,如下所示:

代码语言:javascript
复制
<TextBlock Text="Test" 
           FontFamily="{Binding ElementName=FontList, Path=SelectedItem}"
           Size="{Binding ElementName=Size, Path=SelectedItem}"
           TextWrapping="Wrap"
           Margin="0 0 0 4" />

当我运行程序时,大小不会改变。因此,我尝试将用于Size的绑定添加到Text属性中--以便查看其值:

代码语言:javascript
复制
<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大小的数字部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
复制
<TextBlock Size="{Binding ElementName=Size, Path=SelectedItem.Content}" />

解决方案2:

代码语言:javascript
复制
<ListBox x:Name="Size" SelectedValuePath="Content" />
<TextBlock Size="{Binding ElementName=Size, Path=SelectedValue}" />

为什么FontFamily SelectItem可以工作?

因为该ListBox包含一个字体集合,而不是ListBoxItems的集合(它们仍然是为了表示集合中的每一项而创建的)。如果在代码中定义字体大小的集合,并将列表框的ItemsSource属性绑定到该集合,或者直接在System.Double中将ListBox的内容定义为Xaml值的集合,则可以对字体大小实现相同的行为:

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2012-03-18 06:34:06

1) SelectedItem绑定返回的实际值是一个ListBoxItem对象。要从绑定中获取值(15),您可以使用转换器或使绑定路径更显式,以获取列表框项目的内容属性值:

代码语言:javascript
复制
Size="{Binding ElementName=Size, Path=SelectedItem.Content}"

2)这是一个协变操作,因此每个列表项的类型都是从它的源中推断出来的。字体系列项控件(ListBox)生成的项是它绑定到的集合的结果。Items属性(通过ItemsSource依赖属性填充)是泛型对象的ItemCollection,它采用其相应上下文对象的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9754079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档