Доступ к ListView в ItemTemplate - PullRequest
       4

Доступ к ListView в ItemTemplate

0 голосов
/ 08 ноября 2010

У меня есть 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 объекты List (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

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

-Frinny

Ответы [ 2 ]

0 голосов
/ 12 ноября 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 с соответствующими списками.

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

-Frinny

0 голосов
/ 09 ноября 2010

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

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