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>
修正说明
- 添加ItemsSource绑定:通过
ItemsSource="{Binding AvailableStyles}"将ListView的数据源绑定到当前行数据(GridElement对象)的AvailableStyles属性,选中不同行时,ListView会自动加载对应行的子集合数据。 - 规范ListView视图结构:将
GridView嵌套到ListView.View标签内,这是WPF中为ListView指定GridView视图的标准写法,确保视图能正确渲染。
内容的提问来源于stack exchange,提问作者Andrea M
相关产品推荐
相关产品推荐

