如何从内部列表视图中设置到外部列表视图项的绑定?
How do I set a binding to an outer listview item from within an inner listview?
如果要显示实际的列表视图项(不是其中的 属性),请使用
<ListView Name="FirstExample" ItemsSource="{Binding CityList}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding }"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
和
public List<String> CityList { get; set; } = new List<string> { "Paris", "New York" };
public List<String> Repeats { get; set; } = new List<string> { "One", "Two" };
在视图模型中,使用那个孤独的 Text="{Binding }" 按预期工作,给我们
巴黎
纽约
但是,如果数据模板中的内容正在设置新的数据上下文,您如何访问外部列表视图的实际项目?我希望下面的代码产生
巴黎
巴黎
纽约
纽约
但是我该如何设置 Path={Binding ??????我已经尝试了我能想到的每一种变体,并且也进行了非常多的搜索。使用relativesource 和ancestorlevel=2 好像可以得到正确的listview,但是我就是找不到正确的路径
这样做的目的显然不是这个愚蠢的例子。在实际代码中,我需要将外部列表视图项放入一个多转换器中,该转换器从内部和外部列表视图中获取数据。
<ListView Name="OuterListView" ItemsSource="{Binding CityList}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<ListView Name="InnerListView" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.Repeats}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}, AncestorLevel=2}, Path={Binding ????? }}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您必须将 ListViewItem
作为 RelativeSource
和 AncestorLevel=2
并访问它的 DataContext
:
<ListView Name="OuterListView" ItemsSource="{Binding CityList}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Background="SeaGreen">
<TextBlock Text="{Binding }"/> <!-- entry from outer list -->
<ListView Name="InnerListView" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.Repeats}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Background="Magenta">
<TextBlock Text="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListViewItem, AncestorLevel=2}}"/><!-- entry from outer list -->
<TextBlock Text="{Binding }"/> <!-- entry from inner list -->
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如果要显示实际的列表视图项(不是其中的 属性),请使用
<ListView Name="FirstExample" ItemsSource="{Binding CityList}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding }"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
和
public List<String> CityList { get; set; } = new List<string> { "Paris", "New York" };
public List<String> Repeats { get; set; } = new List<string> { "One", "Two" };
在视图模型中,使用那个孤独的 Text="{Binding }" 按预期工作,给我们
巴黎
纽约
但是,如果数据模板中的内容正在设置新的数据上下文,您如何访问外部列表视图的实际项目?我希望下面的代码产生
巴黎
巴黎
纽约
纽约
但是我该如何设置 Path={Binding ??????我已经尝试了我能想到的每一种变体,并且也进行了非常多的搜索。使用relativesource 和ancestorlevel=2 好像可以得到正确的listview,但是我就是找不到正确的路径
这样做的目的显然不是这个愚蠢的例子。在实际代码中,我需要将外部列表视图项放入一个多转换器中,该转换器从内部和外部列表视图中获取数据。
<ListView Name="OuterListView" ItemsSource="{Binding CityList}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<ListView Name="InnerListView" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.Repeats}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}, AncestorLevel=2}, Path={Binding ????? }}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您必须将 ListViewItem
作为 RelativeSource
和 AncestorLevel=2
并访问它的 DataContext
:
<ListView Name="OuterListView" ItemsSource="{Binding CityList}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Background="SeaGreen">
<TextBlock Text="{Binding }"/> <!-- entry from outer list -->
<ListView Name="InnerListView" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.Repeats}" Width="Auto" Height="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Background="Magenta">
<TextBlock Text="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListViewItem, AncestorLevel=2}}"/><!-- entry from outer list -->
<TextBlock Text="{Binding }"/> <!-- entry from inner list -->
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>