2012-01-12 12 views
1

これで、コード内の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; } 
    } 

残念ながら、これはコンボボックスが開いている空白のリストが表示されます。

私は、各行にバインドされているオブジェクトに可能性リストを格納することで回避できますが、ただ1つのコレクションを使用できるはずです。

私が逃した情報や理解できない情報がある場合は、私に知らせてください。予め

+0

バインディングが動作するために '_RoomList'を' public'にしてはいけませんか? – Default

+0

あなたのRoomListは何ですか?それは 'ObservableCollection <>'ですか? – Default

+0

これらは両方ともMainWindowクラス内にあり、プライベートであっても表示する必要があります。 – SumGuy

答えて

1

おかげで、問題は、結合パス(_RoomList)はリストビューの各エントリのDataContextに相対的であるということです。そしてそのDataContextは表示されたアイテムであり、あなたのビューではありません。

あなたはさまざまな方法でこの問題を解決することができます。

  1. が表示された項目内のリストを入れて - それはあなたがすでに発見して
  2. はあなたのビューに名前を付けてバインディングその名前を使用しないようにしたいものです結合にElementName
  3. 、私の推測は、の各列のDataContext
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プロパティが含まれているものです

関連する問題