2012-01-12 129 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財產

相關問題