Mik*_*ley 10 silverlight childwindow silverlight-4.0 mvvm-light
问候!我喜欢使用MVVM轻巧的框架 - 让我的生活变得更加轻松,并且已经消除了许多难以克服的障碍......
题:
我正在尝试设置一个自定义对话框,用于编辑用户相互发送的消息.我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)
视图:
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();
}
Run Code Online (Sandbox Code Playgroud)
对话保存:
private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
Messenger.Default.Send<Message>(
this.MessageItem, CommandMessages.MessageTypes.MessageSave);
}
Run Code Online (Sandbox Code Playgroud)
这将绑定到ViewModel,它有一个Messenger.Default.Register <>监视CommandTypes.MessageSave,它将生成的MessageItem路由到模型进行存储.....
这非常接近我所做的事情,除了有几件事我做的不同.
以下是我根据建议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();
}
}
Run Code Online (Sandbox Code Playgroud)