可能重複:
How have you successfully implemented MessageBox.Show() functionality in MVVM?如何顯示消息框在MVVM
我想顯示消息框在我的MVVM WPF應用程序。 所以從哪裏調用MessageBox.Show()。
可能重複:
How have you successfully implemented MessageBox.Show() functionality in MVVM?如何顯示消息框在MVVM
我想顯示消息框在我的MVVM WPF應用程序。 所以從哪裏調用MessageBox.Show()。
我發現MVVM在程序員中調用了一條OCD(我從經驗中知道)。這是好事。但是對於某些事情來說,這些努力並不值得,尤其是如果它引入了複雜性的整個順序,只是詢問用戶「你確定你想要xxxx嗎?」
我認爲MessageBox.Show()可以從代碼隱藏,但從來沒有ViewModel調用。在對話框與XAML更好地結合之前,只需點擊並且不會感覺不好。這實際上是WPF UI設計當前狀態的一個灰色區域。
我使用的命令,所以如果我將不得不顯示消息框後按鈕的可以執行和執行功能,我需要傳遞一些數據查看文件後面的代碼,然後它會打破mvvm。 – 2010-09-15 04:30:07
在沒有MVVM的Windows窗體或WPF中,您可以只說MessageBox.Show()就是這樣!如果你可以在MVVM中做同樣的事情,會不會很好?
下面是一個方法來做到這一點 - 它是儘可能接近MessageBox.Show()。
這是MVVM友好的MessageBox_Show()!
public class MyViewModel: ViewModelBase
{
protected void AskTheQuestion()
{
MessageBox_Show(ProcessTheAnswer, "Are you sure you want to do this?", "Alert", System.Windows.MessageBoxButton.YesNo);
}
public void ProcessTheAnswer(MessageBoxResult result)
{
if (result == MessageBoxResult.Yes)
{
// Do something
}
}
}
田田!
這裏是它如何工作的:
所有這一切MessageBox_Show實際上做的是觸發一個事件,所以它是完全MVVM友好。 ViewModel對可能或不可能使用它的任何視圖都一無所知,並且它並不單獨執行Windows MessageBox的顯示,因此它也可以安全地進行單元測試。
在視圖中使用它,這將導致其實際顯示一個MessageBox,你只要訂閱事件並調用e.Show()事件處理程序,如下所示:
public partial class MyView : UserControl
{
public MyView()
{
InitializeComponent();
this.DataContext = new MyViewModel();
(this.DataContext as MyViewModel).MessageBoxRequest += new EventHandler<MvvmMessageBoxEventArgs>(MyView_MessageBoxRequest);
}
void MyView_MessageBoxRequest(object sender, MvvmMessageBoxEventArgs e)
{
e.Show();
}
}
而且這就是您需要做的,以顯示MVVM友好的Windows消息框。
下面的代碼只需要在你的項目中實現一次,或者你可以把它放在一個可重用的共享庫中。
添加到您的視圖模型基類,所以它可以從任何視圖模型被用於:
public class ViewModelBase : INotifyPropertyChanged
{
//...
public event EventHandler<MvvmMessageBoxEventArgs> MessageBoxRequest;
protected void MessageBox_Show(Action<MessageBoxResult> resultAction, string messageBoxText, string caption = "", MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.None, MessageBoxOptions options = MessageBoxOptions.None)
{
if (this.MessageBoxRequest != null)
{
this.MessageBoxRequest(this, new MvvmMessageBoxEventArgs(resultAction, messageBoxText, caption, button, icon, defaultResult, options));
}
}
}
然後添加EventArgs類的事件處理程序:
public class MvvmMessageBoxEventArgs : EventArgs
{
public MvvmMessageBoxEventArgs(Action<MessageBoxResult> resultAction, string messageBoxText, string caption = "", MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.None, MessageBoxOptions options = MessageBoxOptions.None)
{
this.resultAction = resultAction;
this.messageBoxText = messageBoxText;
this.caption = caption;
this.button = button;
this.icon = icon;
this.defaultResult = defaultResult;
this.options = options;
}
Action<MessageBoxResult> resultAction;
string messageBoxText;
string caption;
MessageBoxButton button;
MessageBoxImage icon;
MessageBoxResult defaultResult;
MessageBoxOptions options;
public void Show(Window owner)
{
MessageBoxResult messageBoxResult = MessageBox.Show(owner, messageBoxText, caption, button, icon, defaultResult, options);
if (resultAction != null)resultAction(messageBoxResult);
}
public void Show()
{
MessageBoxResult messageBoxResult = MessageBox.Show(messageBoxText, caption, button, icon, defaultResult, options);
if (resultAction != null) resultAction(messageBoxResult);
}
}
單元測試很簡單:
target.AskTheQuestion();
target.ProcessTheAnswer(System.Windows.MessageBoxResult.Yes);
快樂編碼!
非常有用!謝謝 – Latrova 2016-04-05 12:34:03
好的實現,但它使用事件,這將肯定會導致內存泄漏,特別是當你有很多的意見。 – 2016-09-16 09:33:40
但是通過使用ViewModelBase中的System.Windows對MessageBoxResult的引用,MessageBoxOptions是不是擊敗了MVVM的目的? – 2017-01-04 09:41:47
感謝它真的幫助我 – 2010-09-15 05:43:51
這是嚴重downvoted和標記爲重複,但它也是谷歌的'mvvm messagebox wpf'的結果... – Benjol 2013-04-30 09:24:37
只是說... ..可能不是很漂亮或什麼,但你可以簡單地調用System.Windows.MessageBox.Show(params);來自任何班級。 – Para 2013-12-05 15:59:44