我试图使用两个列表视图(即在同一页面- wpf)来显示有关组类的信息。在第一个Listview中,我想显示组#和组大小(使用gridview),在第二个Listview中,我想显示我在第一个Listview框中选择的组中每个人的名字和姓氏。两个listview都使用gridview。我有一个observableCollection,第一个listview被绑定到。我是否要创建另一个observablecollection来绑定到第二个listview ?如果是,我如何连接这两个集合?我不知道该怎么做。任何帮助都是非常感激的。
xaml: <ListView HorizontalAlignment="Stretch" Margin="0,12" x:Name ="listViewGroups" ItemsSource="{Binding Groups}" IsSynchronizedWithCurrentItem="{x:Null}" Grid.Column="1">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding GroupNumber}" Width="40">
<GridViewColumnHeader Tag="GroupNumber" Content="#" Click="SortClick" />
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding GroupLeader}" Width="120">
<GridViewColumnHeader Tag="GroupLeader" Content="Group Leader" Click="SortClick" />
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding GroupSize}" Width="70">
<GridViewColumnHeader Tag="GroupSize" Content="Group Size" Click="SortClick" />
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<Label Content="Leader" Height="28" Margin="12,12,0,0" Name="lblFirstName" Grid.Column="2" VerticalAlignment="Top" HorizontalAlignment="Left" />
<TextBox Text="{Binding SelectedItem.GroupLeader, ElementName =listViewGroups}" Height="23" Margin="12,31,0,0" Name="txtFirstName" MaxWidth="160" Grid.Column="2" VerticalAlignment="Top" HorizontalAlignment="Left" Width="160" />
<Label Content="Group Members" Height="28" HorizontalAlignment="Left" Margin="14,60,0,0" Name="label1" VerticalAlignment="Top" Grid.Column="2" />
<ListView HorizontalAlignment="Stretch" Margin="12,80,188,12" x:Name ="listViewGroupMembers" ItemsSource="{Binding Groups}" IsSynchronizedWithCurrentItem="{x:Null}" VerticalAlignment="Stretch" Grid.Column="2">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding FirstName}" Width="100">
<GridViewColumnHeader Tag="Name" Content="First Name" Click="SortClick" />
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding LastName}" Width="80">
<GridViewColumnHeader Tag="Name" Content="Last Name" Click="SortClick" />
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
组类:
public class Group
{
public List<Camper> members;
private String name;
public static int groupCount = 0;
private static int optimalSize = 8;
public string GroupNumber { get; set; }
public string GroupLeader { get; set; }
public int GroupSize { get; set; }
public string FirstName { get { return "Testing"; } set { } }
public string LastName { get; set; }
public Group()
{
this.members = new List<Camper>();
this.name = "Group " + groupCount;
groupCount++;
}
}
在主窗口中:下面的点击事件与我制作的工具栏上的自定义按钮有关。当我点击按钮时,组是自定义的。
ObservableCollection<Group> bind = new ObservableCollection<Group>();
private void btnRun_Click(object sender, RoutedEventArgs e)
{
allGroups = AssignRelationshipValues.assignGroups(allCampers);
ObservableCollection<Camper> groupCampers = new ObservableCollection<Camper>();
bind.Groups.Clear();
for (int g = 0; g < allGroups.Count; g++)
{
for (int i = 0; i < allGroups[g].members.Count; i++)
{
groupCampers.Add(allGroups[g].members[i]);
} bind.Groups.Add(new Group { GroupNumber = allGroups[g].getName(), GroupSize = allGroups[g].getOptimalSize(), Members = groupCampers });
}
}
如果我没看错,你想要的是你的第二个ListView
像这样绑定:
<ListView ItemsSource="{Binding SelectedItem.members, ElementName=listViewGroups}" />
类似于与GroupLeader
结合的TextBox
。此外,FirstName
和LastName
不应该是Camper
类而不是Group
类的属性吗?如果我明白你想要什么,它们必须是为了让这个工作。
澄清一下:这个绑定说的是"转到'listViewGroups' ListView
并获得SelectedItem
"。这将是一个Group
对象,因为listViewGroups
绑定到Group
对象的集合。然后,它将尝试在选定的Group
项目上找到一个名为members
的属性,这是您的List<Camper>
-您可能想要更改为ObservableCollection
。然后,第二个ListView
中的任何内容都将引用它绑定到的集合中的对象(Group.members
)来解析绑定,这意味着它将在members
中的Camper
对象上查找FirstName
和LastName
。
关于Silveright/WPF数据绑定的进一步说明,请点击MSDN。