【问题标题】:How do I set a binding to an outer listview item from within an inner listview?如何从内部列表视图中设置与外部列表视图项的绑定?
【发布时间】:2021-09-14 19:49:50
【问题描述】:

如果想要显示一个实际的列表视图项(不是它的属性),那么可以使用

<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 和祖先级别 = 2 似乎得到了正确的列表视图,但我就是无法获得正确的路径。

这样做的目的显然不是这个愚蠢的例子。在实际代码中,我需要将外部列表视图项放入一个多转换器中,该转换器从内部和外部列表视图中获取数据。

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

【问题讨论】:

    标签: wpf xaml listview binding datatemplate


    【解决方案1】:

    您必须将ListViewItemAncestorLevel=2 一起作为RelativeSource 并访问它的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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多