我们已经看到绑定一个单独的对象,还看到绑定一个单独的对象列表。另一种非常流行的方式是绑定多个对象列表,尤其是相关的列表。例如,如果你向用户显示一个客户列表,当他们选中其中一个客户,就会显示客户的相关订单,这时,你就会使用主从复合绑定。

主从复合绑定是一种过滤的形式,在主页面的列表部分,客户452设置了过滤器作为联合到从页面数据的参数,例如,客户452的相关订单。

到我们目前的讨论为止,我们并没有客户和订单这样的模型,但是我们已经有了家庭和人的定义,于是可以进一步形式化这些,如示例4-47

示例4-47

}

在示例4-47中,我们得到了熟悉的具有NameAge属性的Person类,聚合在熟悉的People集合中。进一步,我们有Family这样的类,具有FamilyName属性和People类型的Members属性。最后,我们有一个Families集合,聚合了Family类型的对象。换句话说,families包含着members,后者由带有年龄和名称的people组成。。

你可以想象到FamiliesFamilyPeople以及Person的实例如图4-19所示。

在图4-19中,Families集合构成了主页面的数据,保存着Family类的实例,每一个Family实例中持有一个People类型的Members属性,People类型中保存着Person这样的数据。你可以导入这种数据结构的实例,正如示例4-48所示。

4-19

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定

示例
4-48

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<!-- Window1.xaml -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
<?Mapping
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  XmlNamespace="local" ClrNamespace="MasterDetailBinding" 
?>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
<Window 《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定 xmlns:local="local">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<Window.Resources>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<local:Families x:Key="Families">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
<local:Family FamilyName="Stooge">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<local:Family.Members>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<local:People>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Person Name="Larry" Age="21" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Person Name="Moe" Age="22" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Person Name="Curly" Age="23" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
</local:People>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
</local:Family.Members>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
</local:Family>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
<local:Family FamilyName="Addams">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<local:Family.Members>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<local:People>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Person Name="Gomez" Age="135" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Person Name="Morticia" Age="121" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Person Name="Fester" Age="137" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
</local:People>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
</local:Family.Members>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
</local:Family>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
</local:Families>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</Window.Resources>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
</Window>

在顶级绑定到这些数据,例如,显示这些家庭的姓名,如示例4-49所示。

示例4-49

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<!-- Window1.xaml -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
<?Mapping 《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定 ?>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
<Window 《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<Window.Resources>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<local:Families x:Key="Families">《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定</local:Families>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</Window.Resources>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<Grid DataContext="{StaticResource Families}">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<!-- Families Column -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<TextBlock Grid.Row="0" Grid.Column="0">Families:</TextBlock>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<ListBox Grid.Row="1" Grid.Column="0"
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      IsSynchronizedWithCurrentItem
="True"
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      ItemsSource
="{Binding}">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
<ListBox.ItemTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<DataTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<TextBlock TextContent="{Binding Path=FamilyName}" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
</DataTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
</ListBox.ItemTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
</ListBox>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
</Window>


在示例4-49中,我们在Families列(第0行)做了两件事。第一件将标题设置为常量“Families”字符串;第二件是形成了body主体,这是一个Family对象的清单,位于Families集合中,现时每一个家庭的FamilyName属性,正如图4-20所示。

4-20

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定

4-20并不是一个主从复合结构,因为选中一个主页面的家庭并不会显示这个家庭联合到的详细信息。为了这么做,我们需要绑定到下一级,如示例4-50所示。

示例4-50

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<Grid DataContext="{StaticResource Families}">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<!-- Families Column -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<!-- Members Column -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<TextBlock TextContent="{Binding Path=FamilyName}" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<TextBlock TextContent=" Family Members:" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</StackPanel>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<ListBox Grid.Row="1" Grid.Column="1"
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    IsSynchronizedWithCurrentItem
="True"
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    ItemsSource
="{Binding Path=Members}" >
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<ListBox.ItemTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
<DataTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<StackPanel Orientation="Horizontal">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<TextBlock TextContent="{Binding Path=Name}" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<TextBlock TextContent=" (age: " />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<TextBlock TextContent="{Binding Path=Age}" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<TextBlock TextContent=" )" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
</StackPanel>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
</DataTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
</ListBox.ItemTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</ListBox>


在Members列(第1列),我们也设置了标题和主体,但是这次标题绑定到当前选中的Family对象的FamilyName

同样,回忆在Families列,我们的列表框的源条目通过不带Path属性的Binding语句,绑定到了整个集合。然而,在从页面中,我们想告诉数据绑定引擎,我们想要绑定到当前选中的Family对象的Members属性,这是一个Person对象的列表。图4-21显示了主从绑定的效果。

4-21

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定

但是,稍等:有点过了。主从绑定并没有在这两个级别停下来,根本没有。你可以走得尽可能深,每一个从页面都是主页面的下一级。为了看到这个效果,让我们多增加一级从页面到我们的数据类,如示例
4-51所示。

示例4-51

}


现在,不由仅家庭有了家庭名和成员——带有姓名和年龄的人,而每一个人都有一组特性,每一个都有其独自的描述。张开我们的xaml一小块,包括了这些特性,如示例4-52所示。

示例4-52

 

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<local:Families x:Key="Families">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<local:Family FamilyName="Stooge">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<local:Family.Members>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
<local:People>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<local:Person Name="Larry" Age="21">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
<local:Person.Traits>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
<local:Traits>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定              
<local:Trait Description="In Charge" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定              
<local:Trait Description="Mean" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定              
<local:Trait Description="Ugly" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定            
</local:Traits>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定          
</local:Person.Traits>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
</local:Person>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<local:Person Name="Moe" Age="22" >《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定</local:Person>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
</local:People>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
</local:Famil.Members>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</local:Family>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
</local:Families>

我们可以绑定第3级从页面,如示例4-53所示。

示例4-53

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<Grid DataContext="{StaticResource Families}">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<!-- Families Column -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<!-- Members Column -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<!-- Traits Column -->
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<StackPanel Grid.Row="0" Grid.Column="2" Orientation="Horizontal">
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<TextBlock TextContent="{Binding Path=Members/Name}" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<TextBlock TextContent=" Traits:" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</StackPanel>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
<ListBox Grid.Row="1" Grid.Column="2"
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    IsSynchronizedWithCurrentItem
="True"
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    ItemsSource
="{Binding Path=Members/Traits}" >
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
<ListBox.ItemTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
<DataTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定        
<TextBlock TextContent="{Binding Path=Description}" />
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定      
</DataTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定    
</ListBox.ItemTemplate>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定  
</ListBox>
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
</Grid>

在Families的列标题中,回想我们没有任何绑定;这个文本是硬编码的:

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<TextBlock >Families:</ TextBlock>

Members的列标题中,我们绑定了当先选中的Family对象FamilyName如下:

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<TextBlock … TextContent=”{Binding Path=FamilyName}” />

逻辑上讲,你可以认为是对如下进行了扩展:

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<TextBlock … TextContent=”{Binding Path=Family.FamilyName}” />

这里family是当前选中的Family对象。

取得这一级的更深一级,在具有特性的列标题中,我们将当前选中FamilyMembers属性绑定到当前选中PersonName属性,绑定如下:

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<TextBlock … 
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定TextContent
=”{Binding Path=Members/Name}” />

再次,从逻辑上,你可以把它当作这样的扩展:

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定<TextBlock … 
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定
《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定TextContent
=”{Binding Path=family.Members.person.Name}” />

这里family是当前选中的Family对象,person是当前选中的Person对象。绑定表达式“/”担当了对象间的分隔符,每一级的对象假定为“当前选中的”。

列表框的源条目的绑定以同样的方式工作,除非我们想要的是当前选中PersonTRaits集合,而不是Name。我们的多级主从绑定的示例如图4-22所示。

4-22

《Programming WPF》翻译 第4章 5.主从复合(Master-Detail)绑定

相关文章:

  • 2021-06-18
  • 2021-06-07
  • 2021-08-05
  • 2021-07-20
  • 2021-11-29
  • 2021-10-14
  • 2021-05-25
猜你喜欢
  • 2021-09-06
  • 2021-11-04
  • 2021-12-30
  • 2021-11-06
  • 2021-08-07
  • 2022-02-04
  • 2021-10-21
相关资源
相似解决方案