2012-01-12 2 views
1

Итак, у меня есть listview с несколькими строками, которые определяются путем установки источника items в коде. В каждой сгенерированной строке у меня есть поле со списком. В коде у меня есть еще один массив объектов, который представляет собой сбор, который должен отображать этот combobox.Привязка коллекции к comboboxes в виде списка

Я в основном хочу, чтобы для каждой строки вы можете выбрать опцию из списка. Список возможностей всегда будет одним и тем же, поэтому массив.

Немного кода, который поможет. Это то, что я для 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' быть' public' для привязки к работе? – Default

+0

что такое ваш список комнат? Это 'ObservableCollection <>'? – Default

+0

Они оба находятся в классе MainWindow, он должен быть видимым, даже если он закрыт, правый – SumGuy

ответ

1

Проблема заключается в том, что связывание пути (_RoomList) является относительно DataContext каждой записи в ListView. И это DataContext - это отображаемый элемент, а не ваш вид.

Вы можете решить эту проблему несколькими способами:

  1. Поместите список в отображаемых элементов - это то, что вы уже открыли для себя и хотите избежать
  2. Дайте ваш взгляд имя и использовать это имя связывании, как ElementName
  3. В переплете, найти предок элемента, который является мнением
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> 
0

Попробуйте

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

Здесь ViewModel что содержит ваше RoomList свойства

Смежные вопросы