Доступ к ListView в ItemTemplate

У меня есть ItemsControl, который привязан к списку объектов. У меня есть набор ItemTemplate для ItemsControl... и в ItemTemplate у меня есть ListView, который я хочу привязать к другому списку объектов.

Как мне получить доступ к ListView в ItemsControl.ItemTemplate, чтобы я мог установить его DataContext во второй список объектов?

Вот пример того, что у меня есть:

                <ItemsControl x:Name="DealerShips" ItemsSource="{Binding}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Expander Header="{Binding Name}" Foreground="White">
                                <ListView x:Name="CarTypes" ItemsSource="{Binding}">
                                    <ListView.ItemTemplate>
                                        <CheckBox Content="{Binding Path=Name}" IsChecked="{Binding Path=InStock}"></CheckBox>
                                    </ListView.ItemTemplate>
                                </ListView>
                            </Expander>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

В моем коде VB.NET я могу сослаться на свой ItemsControl «DealerShips», чтобы установить DataContext в список (Of DealerShip) объектов. Я не могу понять, как получить доступ к ListView "CarTypes", чтобы я мог установить его DataContext.

Public Class CarsWindow
    Private _listOfDealerShips As ObservableCollection(Of DealerShip)
    Private _listOfInventory As ObservableCollection(Of Car)

  Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        _listOfDealerShips = New ObservableCollection(Of DealerShip)
        listOfDealerShips.Add(New DealerShip("A"))
        listOfDealerShips.Add(New DealerShip("B"))
        listOfDealerShips.Add(New DealerShip("C"))

        _listOfInventory = New ObservableCollection(Of Cars)
        listOfDealerShips.Add(New Car("TypeX",True))
        listOfDealerShips.Add(New Car("TypeY",False))
        listOfDealerShips.Add(New Car("TypeZ",True))

        DealerShips.DataContext = _listOfDealerShips

        ' I cannot access CarTypes....
        'CarTypes.DataContext = listOfInventory 
  End Sub

  Private Class DealerShip
    Public Property Name As String
    Public Sub New
    End Sub
    Public Sub New(ByVal name As String)
      Me.Name = name
    End Sub
  End Class

  Private Class Car
    Public Property Name As String
    Public Property InStock As Boolean
    Public Sub New
    End Sub
    Public Sub New(ByVal name As String, ByVal isInStock As Boolean)
      Me.Name = name
      Me.InStock = isInStock 
    End Sub
  End Class
End Class

Спасибо за помощь!

-Фринни


person Frinavale    schedule 08.11.2010    source источник


Ответы (2)


Можете ли вы настроить модель представления, содержащую ваши списки, и сделать их общедоступными, установить DataContext окна автомобилей в экземпляр модели представления (возможно, через DI), а затем изменить свой список в xaml, чтобы он выглядел следующим образом:

<ListView x:Name="CarTypes" ItemsSource="{Binding DataContext.ListOfInventory, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
person ihatemash    schedule 09.11.2010

В итоге я создал класс, в котором были оба списка. Как это:

Public Class DealershipDetails
  Public Property ListOfDealerShips As ObservableCollection(Of DealerShip)
  Public Property ListOfInventory As ObservableCollection(Of Car)

  Public Sub New()
     ListOfDealerShips = New ObservableCollection(Of DealerShip)
     ListOfDealerShips.Add(New DealerShip("A"))
     ListOfDealerShips.Add(New DealerShip("B"))
     ListOfDealerShips.Add(New DealerShip("C"))

     ListOfInventory  = New ObservableCollection(Of Cars)
     ListOfInventory.Add(New Car("TypeX",True))
     ListOfInventory.Add(New Car("TypeY",False))
     ListOfInventory.Add(New Car("TypeZ",True))
  End Sub

End Class

Таким образом, я мог привязать ItemsControl к экземпляру класса DealershipDetails и выборочно привязать элементы управления в ItemsControl к соответствующим спискам.

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

-Фринни

person Frinavale    schedule 12.11.2010