Привязка коллекции к спискам в пределах списка

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

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

Немного кода, чтобы помочь. Вот что у меня есть для 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 это отображаемый элемент, а не ваш вид.

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

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

Попробуй это

<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>
Другие вопросы по тегам