2010-11-08 3 views
0

J'ai un ItemsControl qui est lié à une liste d'objets. J'ai un ensemble ItemTemplate pour ItemsControl ... et dans le ItemTemplate j'ai un ListView, que je veux lier à une autre liste d'objets.Accès à ListView dans un ItemTemplate

Comment puis-je accéder à ListView dans ItemsControl.ItemTemplate afin que je puisse définir DataContext à la deuxième liste d'objets?

Voici un exemple de ce que j'ai:

   <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> 

Dans mon code VB.NET je peux me référer à mes « » DEALERSHIPS ItemsControl pour définir les DataContext à une liste (de) CONCESSIONNAIRE objets. Je n'arrive pas à comprendre comment accéder à la ListView "CarTypes" pour que je puisse définir 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 

Nous vous remercions de votre aide!

-Frinny

Répondre

0

J'ai fini par créer une classe qui avait les deux listes en son sein. Comme ceci:

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 

De cette façon, je pourrais lier ItemsControl à une instance de la classe DealershipDetails et lier sélectivement les contrôles au sein de l'ItemsControl aux listes appropriées.

Bien que cette approche fonctionne, ma question originale reste sans réponse. Je ne sais pas comment accéder à un contrôle enfant.

-Frinny

0

Pouvez-vous installer un viewmodel qui contient vos listes et les rendre publics, mis DataContext à une instance de fenêtre voitures du viewmodel (peut-être via DI), puis changez votre listview en XAML pour ressembler cela:

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