代码之家  ›  专栏  ›  技术社区  ›  Frinavale

访问项模板中的ListView

  •  0
  • Frinavale  · 技术社区  · 14 年前

    我有一个itemsControl绑定到对象列表。 我为itemscontrol设置了itemstemplate…在itemtemplate中,我有一个listview,我想将它绑定到另一个对象列表。

    如何访问itemsControl.itemTemplate中的ListView,以便将其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代码中,我可以引用我的“经销商”项控件,将DataContext设置为一个(经销商)对象列表。我不知道如何访问“cartypes”listview以便设置它的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
    

    谢谢你的帮助!

    -弗里尼

    2 回复  |  直到 14 年前
        1
  •  0
  •   ihatemash    14 年前

    可以设置包含列表的ViewModel并将其公开,将Cars窗口的DataContext设置为ViewModel的实例(可能通过DI),然后在XAML中更改ListView,使其如下所示:

    <ListView x:Name="CarTypes" ItemsSource="{Binding DataContext.ListOfInventory, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
    
        2
  •  0
  •   Frinavale    14 年前

    我最终创建了一个包含两个列表的类。 这样地:

    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绑定到经销商详细信息类的实例,并有选择地将itemsControl中的控件绑定到适当的列表。

    虽然这种方法有效,但我最初的问题仍未得到解答。 我不知道如何访问儿童控件。

    -弗里尼