将集合绑定到列表视图中的组合框

时间:2012-01-12 11:20:08

标签: c# wpf listview binding combobox

好的,我有一个包含多行的listview,它是通过在代码中设置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; } 
    }

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

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

很难描述如果有任何我错过的信息或者不可理解的信息请告诉我。

提前致谢

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我的猜测是DataContext的每一行的ListView将成为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>

答案 2 :(得分:0)

试试这个

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

此处ViewModel包含您的RoomList属性