有关wp7列表框和数据绑定的一些设计指导

时间:2011-12-27 20:32:00

标签: windows-phone-7.1 windows-phone-7

我正在将一个Android应用程序移植到wp7,我正在尝试以.net的方式做事,我开始把数据绑定包裹起来,但是当涉及到一些事情时,我迷失了方向。

我的课程包括以下内容:

  • PickLeaf - 列表中每个项目的数据表示
  • PickLeafModel - PickLeaf对象集合的数据表示
  • PickLeafCell - 列表中每个项目的用户控件
  • PickLeafListView - ListBox的派生版本
  • PickLeafPage - 包含列表视图的页面并实例化一些控制器对象和线程
  • IPickLeafListener - PickLeafPage实现的接口,允许它在发生有关PickLeafCell的某些事情时收到通知(点击,打开上下文菜单,滚动窗口已更改)

目前我正在将PickLeafCell控件动态添加到PickLeafListView.Items,这种类型绕过数据绑定并且可能导致我看到的一些错误(例如在滚动时更新它导致滚动窗口变得狂暴)。

问题:如果我更改它以便PickLeafModel可以用作DataSource,如何使用数据绑定将IPickLeafListener和PickLeaf引用传递给PickLeafCell?

谢谢!

1 个答案:

答案 0 :(得分:1)

很难理解你的架构,但我尝试了。

首先,将您的数据绑定到ListBox

listBox.ItemsSource = PickLeafModel;

您的ListBox应如下:

 <ListBox x:Name="listBox" ...>
      <ListBox.ItemTemplate>
           <DataTemplate>
                <my:PickLeafCell DataContext={Binding} TapEvent="Tap" .../>
           </DataTemplate>
      </ListBox.ItemTemplate>
 </ListBox>

这里发生了两件大事:PickLeafCell DataContext绑定到每个列表项的数据。并且您订阅了PickLeafCell自定义活动。

PickLeafCell控件中发生某些事件时,它会引发您的主页订阅的自定义事件

 public class PickLeafCell...
 {
      public delegate void TapEventEventHandler(object sender, EventArgs e);
      public event TapEventEventHandler TapEvent;

      protected virtual void OnTap(EventArgs e) 
      {
           if (TapEvent != null)
                TapEvent(this, e);
      }

这是您拥有事件处理程序的C#主页代码隐藏:

 private Tap(object sender, EventArgs e)
 {
      var item = (sender as FrameworkElement).DataContext as PickLeaf;
 }

PickLeafCell控件中,DataContext已设置为PickLeaf,因此您可以轻松绑定到字段

 <TextBlock Text={Binding SomeFieldOfPickLeaf} />