2012-01-12 87 views
1

好吧,我有一个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; } 
    } 

可惜这显示空白列表时,组合框是开放的。

我确实有办法通过将可能性列表存储在绑定到每一行的对象中,但我确信我应该能够使用单个集合。

这很难描述,所以如果有任何信息我错过了或不可理解,请让我知道。

预先感谢

+0

不应该将'_RoomList'作为绑定的“公共”来工作吗? – Default 2012-01-12 12:18:23

+0

你的RoomList是什么?它是一个'ObservableCollection <>'? – Default 2012-01-12 12:35:34

+0

它们都在MainWindow类中,即使私人时它也应该可见,正确的 – SumGuy 2012-01-12 13:41:06

回答

1

的问题是,所述结合路径(_RoomList)是相对于所述的ListView的每个条目的DataContext。而DataContext是显示的项目,而不是您的视图。

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

  1. 放入显示的项目清单 - 这就是你已经发现了,并希望避免
  2. 给您的视图的名称,并使用该名称作为绑定ElementName
  3. 在绑定,发现是鉴于该项目的祖先
0

我的猜测是,的每一行的将会是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> 
0

试试这个

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

这里ViewModel就是包含您RoomList财产

相关问题