You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF:如何在RowDetailsTemplate中绑定ListView?

解决WPF中RowDetailsTemplate内ListView的绑定问题

问题场景

在WPF的DataGrid中使用RowDetailsTemplate展示行详情,需要让详情内的ListView绑定到当前行数据的子集合(AvailableStyles),实现选中不同主行时,ListView自动切换对应的数据列表。

原代码

XAML代码

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid Name="TestDataGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Code" Binding="{Binding Code}" />
                <DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Border Background="Transparent" BorderBrush="White" BorderThickness="1" CornerRadius="15" Margin="10">
                        <Grid Margin="5">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <StackPanel Grid.Column="0">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock  Text="CurrentStyle: "/>
                                    <TextBlock  Text="{Binding Cstyle}"/>
                                </StackPanel>
                                
                            </StackPanel>
                            <StackPanel Grid.Column="1" VerticalAlignment="Stretch">
                                <TextBlock  Text="Available Styles"/>
                                <ListView x:Name="styleList" Height="135" >
                                    <GridView>
                                        <GridViewColumn DisplayMemberBinding="{Binding sCode}" Header="Name"/>
                                        <GridViewColumn DisplayMemberBinding="{Binding sColor}" Header="Color"/>
                                    </GridView>
                                </ListView>
                            </StackPanel>
                        </Grid>
                    </Border>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>
</Window>

后台C#代码

using System.Collections.Generic;
using System.Windows;

namespace TestWPF
{
    /// <summary>
    /// Logica di interazione per MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public List<GridElement> GridList { get; set; }
        public MainWindow()
        {
            InitializeComponent();

            GridList = new List<GridElement>
            {
                new GridElement
                {
                    Code = "ABC",
                    Description = "Description for ABC",
                    Cstyle = "Current style ABC",
                    AvailableStyles = new List<Styles> { new Styles() { sCode = "Styletest1-ABC", sColor = "blue" },
                    new Styles() { sCode = "Styletest2-ABC", sColor = "red" }

                }
                },
                new GridElement
                {
                    Code = "DEF",
                    Description = "Description for DEF",
                    Cstyle = "Current style DEF",
                    AvailableStyles = new List<Styles> { new Styles() { sCode = "Styletest1-DEF", sColor = "white" },
                    new Styles() { sCode = "Styletest2-ABC", sColor = "black" }

                }
                }
            };

            TestDataGrid.ItemsSource = this.GridList;
        }
    }

    public class GridElement
    {
        public string Description { get; set; }
        public string Code { get; set; }
        public string Cstyle { get; set; }
       

        public List<Styles> AvailableStyles { get; set; }
    }

    public class Styles
    {
        public string sCode { get; set; }
        public string sColor { get; set; }

    }
}

问题现象

运行后,主DataGrid的行详情中ListView无法正确显示对应行的AvailableStyles数据列表,选中不同行时ListView内容无变化。

解决方案

修改RowDetailsTemplate内的ListView部分代码,调整绑定和视图结构:

<ListView x:Name="styleList" Height="135" ItemsSource="{Binding AvailableStyles}" >
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding sCode}" Header="Name"/>
            <GridViewColumn DisplayMemberBinding="{Binding sColor}" Header="Color"/>
        </GridView>
    </ListView.View>
</ListView>

修正说明

  1. 添加ItemsSource绑定:通过ItemsSource="{Binding AvailableStyles}"将ListView的数据源绑定到当前行数据(GridElement对象)的AvailableStyles属性,选中不同行时,ListView会自动加载对应行的子集合数据。
  2. 规范ListView视图结构:将GridView嵌套到ListView.View标签内,这是WPF中为ListView指定GridView视图的标准写法,确保视图能正确渲染。

内容的提问来源于stack exchange,提问作者Andrea M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:54:52