将一个集合绑定到一个列表视图中的组合框
问题描述:
好吧,我有一个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; }
}
可惜这显示空白列表时,组合框是开放的。
我确实有办法通过将可能性列表存储在绑定到每一行的对象中,但我确信我应该能够使用单个集合。
这很难描述,所以如果有任何信息我错过了或不可理解,请让我知道。
预先感谢
答
的问题是,所述结合路径(_RoomList
)是相对于所述的ListView的每个条目的DataContext
。而DataContext
是显示的项目,而不是您的视图。
您可以通过多种方式解决这个问题:
- 放入显示的项目清单 - 这就是你已经发现了,并希望避免
- 给您的视图的名称,并使用该名称作为绑定
ElementName
- 在绑定,发现是鉴于该项目的祖先
答
我的猜测是,的每一行的将会是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>
答
试试这个
<ComboBox Name="cbSchemeList" ItemsSource="{Binding RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type ViewModel}},
Path=RoomList }" SelectedValue="{Binding Path=Room}" />
这里ViewModel
就是包含您RoomList
财产
不应该将'_RoomList'作为绑定的“公共”来工作吗? – Default 2012-01-12 12:18:23
你的RoomList是什么?它是一个'ObservableCollection '? – Default 2012-01-12 12:35:34
它们都在MainWindow类中,即使私人时它也应该可见,正确的 – SumGuy 2012-01-12 13:41:06