Привязка коллекции к спискам в пределах списка
Итак, у меня есть просмотр списка с несколькими строками, который определяется настройкой источника данных в коде. Внутри каждого сгенерированного ряда у меня есть поле со списком. В коде у меня есть другой массив объектов, который является коллекцией, которую должен отображать этот комбинированный список.
Я в основном хочу, чтобы для каждой строки вы могли выбрать опцию из списка. Список возможностей всегда будет одинаковым, отсюда и массив.
Немного кода, чтобы помочь. Вот что у меня есть для 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; }
}
К сожалению, это показывает пустой список, когда выпадающий список открыт.
У меня есть способ обойти это путем сохранения списка возможностей в объекте, который связан с каждой строкой, но я уверен, что я смогу использовать только одну коллекцию.
Это сложно описать, поэтому, если есть какая-то информация, которую я пропустил или она не понятна, пожалуйста, дайте мне знать.
заранее спасибо
3 ответа
Проблема в том, что путь привязки (_RoomList
) относительно DataContext
каждой записи ListView. И это DataContext
это отображаемый элемент, а не ваш вид.
Вы можете решить это несколькими способами:
- Поместите список в отображаемые элементы - это то, что вы уже обнаружили и хотите избежать
- Дайте вашему виду имя и используйте это имя как привязку
ElementName
- В привязке найдите предка элемента, который является представлением
Попробуй это
<ComboBox Name="cbSchemeList" ItemsSource="{Binding RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type ViewModel}},
Path=RoomList }" SelectedValue="{Binding Path=Room}" />
Вот ViewModel
это то, что содержит ваш RoomList
имущество
Я думаю, что 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>