【问题标题】:Windows Phone - MVVM Light - Multiple ViewModel in a single pageWindows Phone - MVVM Light - 单个页面中的多个 ViewModel
【发布时间】:2014-04-15 08:58:52
【问题描述】:

我是 Windows Phone 开发的新手。 我正在使用 MVVM Light Toolkit 为 Windows Phone 8 编写应用程序。
我有一个带有 longlistselector 的 MainPage,使用 relaycommand 导航到详细信息页面,一切都很好。

现在在详细信息页面中,我必须使用从 MailPage(longlistselector 的 selecteditem)接收到的绑定上下文来填充 UI 控件。我的问题是我在详细信息页面中,应该将哪个选定项绑定到从主页接收到的数据上下文。

只是在主页中举个例子,我将 lostlingselector 绑定到 mainviewmodel 的任务对象列表;每个任务都有自己的类别,可以从可用的任务类别中选择。我怎么能接近这个?是否可以将详细页面中 ListPicker 控件的 ItemSource 绑定到不同的视图模型,并将同一控件的 SelectedItem 绑定到默认视图模型(选定的任务对象)的属性类别?

谢谢。

【问题讨论】:

    标签: c# xaml windows-phone-8 mvvm


    【解决方案1】:

    您可以使用它自己的视图模型创建一个新视图,并使用 MVVM Light Messenger 类在视图模型之间传递数据。

    类似:

    public class DetailsViewModel
    {    
        public DetailsViewModel()
        {
    
            Messenger.Default.Register<Item>(this, "ItemDetails", i=> ViewItemDetails(i));
        }
    
        public void ViewItemDetails(Item i)
        {            
           //Now you can bind it to your UI
        }
    }
    

    并像这样从您的主视图模型中传递对象(ItemDetails 它只是一个标识侦听器的标记)

    Messenger.Default.Send<Item>(SelectedItem, "ItemDetails");
    

    【讨论】:

      【解决方案2】:

      您不应该真正搞砸不同ViewModel 之间的绑定。要设置视图模型之间的交互,您可以使用 MvvmLight 工具包中的Messnger,将其注入两个对象并定义正确的发布-订阅关系。

      public class FirstViewModel : INotifyPropertyChanged
      {
         private IMesseger messenger;
      
         ...
      
         public FirstViewModel(IMessenger messenger)
         {
             this.messenger = messenger;
         }
      
         public Item SelectedItem
         {
             get
             {
                  return this.selectedItem;
             }
      
             set
             {
                  this.selectedItem = value;
                  this.messenger.Send(new GenericMessage<Item>(this.selectedItem));
                  this.OnPropertyChanged("SelectedItem");
             }
         }
      }
      
      public class SecondViewModel : INotifyPropertyChanged
      {
         private IMesseger messenger;
      
         ...
      
         public SecondViewModel(IMessenger messenger)
         {
             this.messenger = messeger;
             this.messenger.Register<GenericMessage<Item>>(this, this.HandleItemSelected);
         }
      
         ...
      }
      

      因此,在两个 VM 之间共享相同的 Messenger 实例后,您将获得具有松散耦合关系的所需功能,这从测试的角度来看是好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        相关资源
        最近更新 更多