MVVM Light (Part 4)

原文地址:http://jesseliberty.com/2011/01/07/windows-phone-from-scratch-19-mvvm-light-toolkit-soup-to-nuts-4/

 

让我们回顾一下,前面三部分使用了ViewModel,并绑定到ViewModel。在这个迷你教程中,我将展示如何把ViewModel中的collection绑定到View中的ListBox的基础知识。接下来,我将展示如何捕获ListBox的选择,在ViewModel中确定详情页面应该如何显示。

 

我们来创建一个简单的应用程序,将显示客户和他们的电子邮件的全名,并最终允许用户点击某客户并显示此客户的详细信息。

 

我们开始创建一个新的MVVM程序。创建后,在Blend中打开,并在content panel中添加一个ListBox。

 

创建CustomerCollection类

CustomerCollection类将给我们一些数据以用来展示。我从之前的demo中“借用”这个类。这个类包含许多字段(姓、名、地址、城市、邮编、电话、传真、电子邮件),属性,最重要的返回一个随机混合和匹配值的observable collection。

 

Binding the ItemSource

理解MVVM处理数据绑定的关键是View的DataContext是ViewModel。正如你所期望的,在View中为ItemSource的绑定应该如下所示:

   1: <ListBox
   2:    x:Name="PersonListBox"
   3:    Margin="10"
   4:    
ItemsSource="{Binding Customers}">

 

当你安装了MVVM Light,页面的Data Context应该设置为ViewModel,你需要一个只读的属性来绑定。我建议使用MVVM Light中的code snippet。

 

因此,返回VS,在code behind文件,MainViewModel.cs里,输入mvvminpc,按Tab。这将帮助你快速完成输入属性的任务,你可以设置属性的名字为Customers,返回变量为_customers。但我们不需要返回变量也不需要Setter,所以我们将使用CustomerCollection类中的Customers属性。

   1: public ObservableCollection<Customer> Customers
   2: {
   3:    get
   4:    {
   5:       var customerCollection = new CustomerCollection();
   6:       
return customerCollection.Customers;
   7:    }
   8: }

 

剩下的就是在View里提供一个DataTemplate,这样每个客户就像我们希望的一样显示出来了:

   1: <ListBox
   2:    x:Name="PersonListBox"
   3:    Margin="10"
   4:    ItemsSource="{Binding Customers}">
   5:    <ListBox.ItemTemplate>
   6:       <DataTemplate>
   7:          <StackPanel>
   8:             <StackPanel
   9:                x:Name="DataTemplateStackPanel"
  10:                Orientation="Horizontal">
  11:                <TextBlock
  12:                   x:Name="FirstName"
  13:                   Text="{Binding First}"
  14:                   Margin="0,0,5,0"
  15:                   Style="{StaticResource PhoneTextExtraLargeStyle}" />
  16:                <TextBlock
  17:                   x:Name="LastName"
  18:                   Text="{Binding Last}"
  19:                   Margin="0"
  20:                   Style="{StaticResource PhoneTextExtraLargeStyle}" />
  21:             </StackPanel>
  22:             <TextBlock
  23:                x:Name="Email"
  24:                Text="{Binding Email}"
  25:                Margin="0"
  26:                Style="{StaticResource PhoneTextSubtleStyle}" />
  27:  
  28:          </StackPanel>
  29:       </DataTemplate>
  30:    </ListBox.ItemTemplate>
  31: </ListBox>

 

最后,我们需要处理用户点击每个客户的事件,并转向一个详情页面,下个部分会继续讨论。

 

源代码下载

posted @   yan_xiaodi  阅读(956)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示