【问题标题】:Accessing ListView within an ItemTemplate在 ItemTemplate 中访问 ListView
【发布时间】:2010-11-08 18:23:59
【问题描述】:

我有一个绑定到对象列表的 ItemsControl。 我为 ItemsControl 设置了一个 ItemTemplate...,在 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 代码中,我可以参考我的“DealerShips”ItemsControl 将 DataContext 设置为 List(Of DealerShip) 对象。我不知道如何访问“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

感谢您的帮助!

-弗林尼

【问题讨论】:

    标签: wpf wpf-controls binding


    【解决方案1】:

    您能否设置一个包含您的列表的视图模型并将其公开,将汽车窗口的 DataContext 设置为视图模型的实例(可能通过 DI),然后在 xaml 中更改您的列表视图,如下所示:

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

    【讨论】:

      【解决方案2】:

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

      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 中的控件绑定到适当的列表。

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

      -弗林尼

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多