【问题标题】:combobox and listview binding issue wpf c#组合框和列表视图绑定问题 wpf c#
【发布时间】:2017-10-08 20:02:10
【问题描述】:

我有一个组合框,它在下拉列表中显示列表视图,我遵循 MVVM 模式,我还在我的 Viewmodel 中设置了公共属性,当我将它分配给标签时它工作正常,但对于组合框它似乎没有依赖我的绑定。我尝试了很多方法,但无法找到问题。

XAML:

 <ComboBox Name="SearchBox" IsEditable="True"  Background="White"  md:HintAssist.Hint="Search MUID"    Grid.Column="1" Margin="5 0 0 0" 
                  Grid.Row="0"  Height="40" Width="400"  HorizontalContentAlignment="Left" HorizontalAlignment="Left" SelectedItem="{Binding ElementName=lstview ,Path=SelectedItem}" >
                                <ComboBoxItem>
                                <ListView x:Name="lstview" ItemsSource="{Binding filterSW}" 
                    SelectedItem="{Binding SelectedMU}" 
                     Height="200" ScrollViewer.VerticalScrollBarVisibility="Visible">
                                    <ListView.View>
                                        <GridView>
                                            <GridViewColumn Width="130"  Header="Mu-ID"    />
                                            <GridViewColumn Width="130" Header="MU-Identifier" DisplayMemberBinding="{Binding MU_Identifier}"  />
                                            <GridViewColumn Width="130"  Header="Status" DisplayMemberBinding="{Binding RequestType}" />
                                            <GridViewColumn Width="130" Header="UniqueID"  />
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                                </ComboBoxItem>
                            </ComboBox>

当我使用公共属性并访问其元素时,这对我来说很好,我也尝试设置 text={Binding SelectedMU.MU_Identifier} 和 selectedvalue 但它只是不起作用。

 <Label Grid.Column="3" HorizontalAlignment="Center"  Background="GreenYellow" Content="{Binding SelectedMU.MU_Identifier}"></Label>

【问题讨论】:

  • 你的绑定对于组合框来说有点奇怪。为什么要将 ListView 注入单个 ComboBox 项?为什么要有一个 ComboBox?

标签: c# wpf data-binding


【解决方案1】:

您似乎正试图在 ComboBox 下拉列表中显示多列列表,而不是标准列表,其中每个项目仅显示一个文本行。

为实现此效果,您在下拉列表中放置了ListView

不幸的是,这行不通。

ComboBoxListView 都源自 Selector,这是一种允许从列表中选择项目的抽象。这将属性SelectedItem 限制为包含在列表中 的项目之一。如果您尝试为该属性分配它不在列表中的任何值,则该分配将不起作用,该属性将保留它在您进行分配之前的值。

现在,该列表既可以在 XAML 中指定,也可以作为属性ItemsSource 的绑定提供。您为ListView 正确绑定。但是对于ComboBox,您没有指定该绑定。相反,您只需指定一个 ComboBoxItem 类型的项目,其中包含整个 ListBox 作为其值。因此,唯一可以成功分配给ComboBoxSelectedItem 属性的值是单个ComboBoxItem。但是您的绑定永远不会分配该值,这就是 ComboBox 在关闭时从不显示任何内容的原因。

当它打开时,它会显示包含ListView 的单个项目,但这只是一种视觉效果。数据绑定是行不通的。它适用于Label 的原因是因为Label 不受限制,可以显示ListView 告诉它显示的任何内容。

只有当两个控件对ItemsSourceSelectedItem 属性具有相同的绑定时,您才能同步ListViewComboBox。但在这种情况下,您将无法将ListView 放在下拉列表中。

例如,通过自定义ComboBox 的模板,如https://zamjad.wordpress.com/2012/08/15/multi-columns-combo-box 中所述,您可以获得最接近您想要的内容。与ListView 相比,这不会给您带来的是列标题。此外,列将在下拉列表中均匀分布,但这就是您在ListView 中所拥有的内容。

如果您想自动调整它们的大小,您需要将Width="Auto" SharedSizeGroup="cN" 添加到每个ColumnDefinition 中,其中“cN”应该具有列号而不是 N,以使它们在 Grid 中唯一并添加 @ 987654353@到&lt;ComboBox &gt;

对于人们期望更简单的事情来说,这会带来很多麻烦,但是不幸的是,您不能在ComboBox 的模板中放置ListView,这是基类Selector 的限制。使用它的项目列表。

如果您愿意考虑使用 3rd 方控件库,还有其他选择。我与Syncfusion 合作过,他们有SfMultiColumnDropDown 可以满足您的需求。我很确定其他流行的库也有类似的控件。

【讨论】:

  • 感谢您的洞察力。 :)
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多