题:
我正在尝试设置一个自定义对话框,用于编辑用户发送给对方的消息.我正在尝试使用使用MVVM框架的ChildWindow对象来构造一个silverlight自定义对话框.
想知道是否有任何建议可以如何实现
按照我在这里找到的对话MVVM示例代码:http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338我陷入困境,因为Silverlight中的ChildWindow对话框对象是异步的,并且有一个不同的Result类.
所以 – 我现在的基本思想是使用类的视图模型(在这种情况下是Matrix.Messageviewmodel)来创建自定义对话框的实例,通过Messenger.Send<>发送它,处理注册的消息在显示对话框的视图中,然后让ChildWindow对话框的Save按钮处理程序使用修改后的内容触发一个Messenger.Send,然后使用viewmodel上的Save方法存储…
似乎有点圆滑 – 所以想确保没有一个更干净的方法….
相关代码位:
查看型号:
messageDialogBox = new MessageEditorDialog( selectedMessage,this.SelectedSiteId,this.LoggedOnEmployee.Id,this.Projects); DialogMessage editMessage = new DialogMessage( this,messageDialogBox,"Edit Message",DialogMessageCallback); Messenger.Default.Send(editMessage);
视图:
public ViewHost() { InitializeComponent(); Loaded += new RoutedEventHandler(ViewHost_Loaded); if (!viewmodelBase.IsInDesignModeStatic) { // Use MEF To load the View Model CompositionInitializer.SatisfyImports(this); } ApplicationMessages.IsBusyMessage.Register(this,OnIsBusyChange); Messenger.Default.Register<DialogMessage>(this,msg => ShowDialog(msg)); } private void ShowDialog(DialogMessage msg) { MessageEditorDialog myDialog = (MessageEditorDialog) msg.Target; myDialog.Show(); }
对话框保存:
private void ButtonSave_Click(object sender,RoutedEventArgs e) { Messenger.Default.Send<Message>( this.MessageItem,CommandMessages.MessageTypes.MessageSave); }
这可以重新映入viewmodel,它具有一个Messenger.Default.Register<>观看CommandTypes.MessageSave,将生成的MessageItem路由到模型进行存储…..
解决方法
>我将有一个视图模型为我的对话视图,并将消息逻辑移动到它,而不是视图的代码背后.
>我将在我的视图模型中使用保存命令,并将ButtonSave绑定到该命令.这将保存逻辑移动到视图模型,而不是视图的后面的代码.
>当点击保存按钮时,您正在使用其他消息.此外,您没有使用DialogMessage的回调.假设您更改为使用保存命令,则可以将消息保存在视图模型中的私有成员中,然后在用户保存时使用消息的回调.
>您可能需要考虑重新使用对话框视图,或确保视图正确清理,以免最终导致内存泄漏.
以下是对您的观点模型的更改,遵循建议2& 3.
public class MessageEditorDialogviewmodel : viewmodelBase { private DialogMessage _dialogMessage; public RelayCommand SaveCommand { get; private set; } public DialogMessage Message { get; set; } public MessageEditorDialogviewmodel() { SaveCommand = new RelayCommand(SaveCommandExecute); } private SaveCommandExecute() { Message.Execute(); } }