【问题标题】:Binding a collection to comboboxes within a listview将集合绑定到列表视图中的组合框
【发布时间】:2012-02-08 16:34:49
【问题描述】:

好的,我有一个包含几行的列表视图,它是通过在代码中设置 itemsource 来定义的。在生成的每一行中,我都有一个组合框。在代码中,我有另一个对象数组,这是该组合框应显示的集合。

我基本上想要它,以便为每一行从列表中选择一个选项。可能性列表将始终相同,因此数组。

一些代码可以提供帮助。这就是我为 XAML 所拥有的:

    <ListView Name="lvVanList">
        <ListView.View>
            <GridView>
                <DisplayMemberBinding="{Binding Path=Number}">Van</GridViewColumn>
                <GridViewColumn Header="Rooms">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <ComboBox Name="cbSchemeList" ItemsSource="{Binding Path=_RoomList}" SelectedValue="{Binding Path=Room}" DisplayMemberPath="Name" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

背后的代码:

    private RoomList _RoomList;

    public populateList()
    {
        this.lvVanList.ItemsSource = this.getVans;
        this._RoomList = this.getRooms;
    }

    private class Room
    {
        string Name { get; set; }
        int Windows { get; set; } 
    }

不幸的是,当组合框打开时,这会显示一个空白列表。

我确实有办法解决这个问题,方法是将可能性列表存储在绑定到每一行的对象中,但我确信我应该能够只使用一个集合。

很难描述,所以如果有任何我遗漏或无法理解的信息,请告诉我。

提前致谢

【问题讨论】:

  • 不应该 _RoomListpublic 绑定工作?
  • 您的 RoomList 是什么?是ObservableCollection&lt;&gt;吗?
  • 它们都在 MainWindow 类中,即使是私有的,它也应该是可见的,对
  • _RoomList 只是一个列表

标签: c# wpf listview binding combobox


【解决方案1】:

问题是绑定路径(_RoomList)是相对于ListView的每个条目的DataContextDataContext 是显示的项目,而不是您的视图。

您可以通过多种方式解决此问题:

  1. 将列表放在显示的项目中 - 这是您已经发现并希望避免的内容
  2. 为您的视图命名并将该名称绑定为ElementName
  3. 在绑定中,找到作为视图的项目的祖先

【讨论】:

    【解决方案2】:

    我的猜测是ListView 的每一行的DataContext 将是ListView 的那一行所绑定的项目。因此,当绑定到 _RoomList 属性时,它会尝试绑定到每个项目上的那个。

    相反,您需要将_RoomList 绑定指向包含该属性的元素。例如,如果它在MainWindow 中,则将属性x:Name="This" 添加到MainWindow,然后将绑定更改为ItemsSource={Binding ElementName=This, Path=_RoomList}

    你可以如何处理它的一个例子(使用你的代码的修改版本):

    <Window x:Class="ComboBoxListViewBinding.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="This"
            Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
        <Grid>
            <ListView Name="lvVanList">
                <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=Number}">Van</GridViewColumn>
                        <GridViewColumn Header="Rooms">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <ComboBox Name="cbSchemeList" ItemsSource="{Binding Path=RoomList}" SelectedValue="{Binding Path=Room}" />
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
    
                <TextBlock Text="Testing" />
                <TextBlock Text="Testing" />
                <TextBlock Text="Testing" />
            </ListView>
        </Grid>
    </Window>
    

    【讨论】:

      【解决方案3】:

      试试这个

      <ComboBox Name="cbSchemeList"  ItemsSource="{Binding RelativeSource={RelativeSource
          FindAncestor, AncestorType={x:Type ViewModel}},
          Path=RoomList }" SelectedValue="{Binding Path=Room}" />
      

      这里 ViewModel 包含您的 RoomList 属性

      【讨论】:

        猜你喜欢
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        相关资源
        最近更新 更多