C# Windows Phone 8具有MVVM的一个页面的多个实例

C# Windows Phone 8具有MVVM的一个页面的多个实例,c#,mvvm,windows-phone-8,windows-phone,mvvm-light,C#,Mvvm,Windows Phone 8,Windows Phone,Mvvm Light,我正在编写Windows Phone聊天应用程序,我想实现ChatPage,它将用于保留对话视图。整个想法是创建尽可能类似于SMS页面的视图,并在该页面的实例之间切换 问题来了——在页面的每个实例上,我都需要绑定存储在XML文件中的Contact和ContactMessages。我认为从XML文件中为Contact获取适当的消息可以简单地用构造函数编写。但是如何打开页面的新实例并向其发送联系人 我正在使用MVVM Light toolkit,我可以使用Messanger来完成这项工作,但如何确保

我正在编写Windows Phone聊天应用程序,我想实现
ChatPage
,它将用于保留对话视图。整个想法是创建尽可能类似于SMS页面的视图,并在该页面的实例之间切换

问题来了——在页面的每个实例上,我都需要绑定存储在XML文件中的
Contact
ContactMessages
。我认为从XML文件中为
Contact
获取适当的消息可以简单地用构造函数编写。但是如何打开页面的新实例并向其发送
联系人

我正在使用MVVM Light toolkit,我可以使用
Messanger
来完成这项工作,但如何确保我的
联系人
不会在页面的其他实例中注册。在这种情况下,注册
ChatPageViewModel
的实例无法在
ViewModelLocator
中实现,因为我需要使用该
ViewModel
的多个实例(如果我错了,请责备我,我是MVVM方面的新手)


有没有办法做到这一点?或者我的想法完全错误?

您可以尝试使用接口创建服务。当客户单击联系人时,传递此服务可以搜索的参数,并返回联系人的消息。每个需要此服务的ViewModel都可以从构造函数中获取。只需要一些参数就可以知道要读取哪个xml

我不知道是否有一个IoC容器。Unity或Autofac或其他公司也可以解决您的问题

如果使用Autofac,则可以使用与此类似的类:

public class ViewModelLocator
{
    private IContainer container;
    public ViewModelLocator()
    {
        ContainerBuilder builder = new ContainerBuilder();

        builder.RegisterType<MainViewModel>();

        container = builder.Build();
    }

    public MainViewModel MainViewModel
    {
        get { return container.Resolve<MainViewModel>(); }
    }
}
公共类ViewModelLocator
{
私人集装箱;
公共ViewModelLocator()
{
ContainerBuilder=新的ContainerBuilder();
RegisterType();
container=builder.Build();
}
公共主视图模型主视图模型
{
获取{return container.Resolve();}
}
}
您可以像以下参数一样处理这些实例:

builder.RegisterType<MainViewModel>().InstancePerDependency();

builder.RegisterType<MainViewModel>().InstancePerLifetimeScope();

builder.RegisterType<MainViewModel>().SingleInstance();
builder.RegisterType().InstancePerDependence();
builder.RegisterType();
builder.RegisterType().SingleInstance();
欲了解更多信息和


希望有帮助。你好

基于MVVM灯光,我会选择这个场景:

在中央页面上,您有一个所有联系人的列表。一旦用户选择了一个联系人,您就会广播一条消息,说明已选择了一个联系人。对话视图模型订阅此消息并从模型加载对话。联系人视图模型使用导航到对话视图

联系人视图模型的(部分):

public ContactsViewModel(IDataService dataService, INavigationService navigationService)
{
    _dataService = dataService;
    _navigationService = navigationService;
}

private RelayCommand _showConversation;

public RelayCommand ShowEvents
{
    get
    {
        return _showConversation ?? (_showConversation = new RelayCommand(ExecuteShowConversation));
    }
}

private void ExecuteShowConversation()
{
    Messenger.Default.Send(new ContactSelectedMessage(){Contact = Contact);
    _navigationService.NavigateTo(new Uri("/Views/ConversationView.xaml", UriKind.RelativeOrAbsolute));
}
public ConversationViewModel(IDataService dataService, INavigationService navigationService)
{
    _dataService = dataService;
    _navigationService = navigationService;
    Messenger.Default.Register<ContactSelectedMessage>(this, OnContactSelected);
}

private void OnContactSelected(ContactSelectedMessage contactSelectedMessage)
{
    _dataService.GetConversation(contactSelectedMessage.Contact);
}
对话视图模型的(部分):

public ContactsViewModel(IDataService dataService, INavigationService navigationService)
{
    _dataService = dataService;
    _navigationService = navigationService;
}

private RelayCommand _showConversation;

public RelayCommand ShowEvents
{
    get
    {
        return _showConversation ?? (_showConversation = new RelayCommand(ExecuteShowConversation));
    }
}

private void ExecuteShowConversation()
{
    Messenger.Default.Send(new ContactSelectedMessage(){Contact = Contact);
    _navigationService.NavigateTo(new Uri("/Views/ConversationView.xaml", UriKind.RelativeOrAbsolute));
}
public ConversationViewModel(IDataService dataService, INavigationService navigationService)
{
    _dataService = dataService;
    _navigationService = navigationService;
    Messenger.Default.Register<ContactSelectedMessage>(this, OnContactSelected);
}

private void OnContactSelected(ContactSelectedMessage contactSelectedMessage)
{
    _dataService.GetConversation(contactSelectedMessage.Contact);
}
公共会话视图模型(IDataService数据服务、INavigationService导航服务)
{
_数据服务=数据服务;
_导航服务=导航服务;
Messenger.Default.Register(此,OnContactSelected);
}
ContactSelected上的私有void(ContactSelectedMessage ContactSelectedMessage)
{
_dataService.GetConversation(contactSelectedMessage.Contact);
}
为了让viewmodel接收消息,应该在消息广播之前对其进行实例化。因此,必须在ViewModelLocator中实例化它

在ViewModelLocator中:

static ViewModelLocator()
{
    /// parts missing for brevity

    SimpleIoc.Default.Register<IDataService, DataService>();
    SimpleIoc.Default.Register<INavigationService, NavigationService>();
    SimpleIoc.Default.Register<ContactsViewModel>();
    SimpleIoc.Default.Register<ConversationViewModel>(true);
}
静态ViewModelLocator()
{
///为简洁起见,缺少部分
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register(true);
}