我有一个
WPF窗口,其视图模型设置为其DataContext,并且具有一个带有DataTemplate的ListBox,其ItemsSource绑定到视图模型,如下例所示:
查看型号:
using System.Collections.Generic; namespace Example { class Member { public string Name { get; set; } public int Age { get; set; } } class Team { private List<Member> members = new List<Member>(); public string TeamName { get; set; } public List<Member> Members { get { return members; } } } }
MainWindow.xaml:
<Window x:Class="Example.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:l="clr-namespace:Example" Title="Example" Height="300" Width="300" Name="Main"> <Window.DataContext> <l:Team TeamName="The best team"> <l:Team.Members> <l:Member Name="John Doe" Age="23"/> <l:Member Name="Jane Smith" Age="20"/> <l:Member Name="Max Steel" Age="24"/> </l:Team.Members> </l:Team> </Window.DataContext> <ListBox ItemsSource="{Binding Path=Members}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=TeamName}" Margin="4"/> <TextBlock Text="{Binding Path=Name}" Margin="4"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Window>
当然,TeamBox的TeamName属性不会显示在ListBox项中,因为LisBox的每个项都是List.ItemTemplate的DataContext,它会覆盖Window的DataContext.
问题是:如何从ListBox的DataTemplate中数据绑定到视图模型(Window.DataContext)的TeamName属性?
我将l:Team声明提取到Window.Resources部分,并从DataContext和DataTemplate中引用它:
原文链接:https://www.f2er.com/windows/366213.html<Window x:Class="Example.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:l="clr-namespace:Example" Title="Example" Height="300" Width="300" Name="Main"> <Window.Resources> <l:Team x:Key="data" TeamName="The best team"> <l:Team.Members> <l:Member Name="John Doe" Age="23"/> <l:Member Name="Jane Smith" Age="20"/> <l:Member Name="Max Steel" Age="24"/> </l:Team.Members> </l:Team> <Window.Resources> <Window.DataContext> <StaticResource ResourceKey="data"/> </Window.DataContext> <ListBox ItemsSource="{Binding Path=Members}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Source={StaticResource data},Path=TeamName}" Margin="4"/> <TextBlock Text="{Binding Path=Name}" Margin="4"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Window>