2011-06-22 16 views
8

का उपयोग करके DialogResult को कैसे प्राप्त करें I mvvm-light messenger क्षमता का उपयोग करने के लिए अपने दृश्य में एक कस्टम पुष्टिकरण पासवर्ड संवाद खोलने का प्रयास कर रहा हूं, जो मेरे व्यूमोडेल में एक कमांड द्वारा ट्रिगर किया गया है।mvvm-light Messenger

मुझे लगता है कि मैं Messenger.Default.Register और Messenger.Default.Send के उपयोग को समझता हूं।

लेकिन मैं अपने व्यूमोडेल में संवाद परिणामों को वापस कैसे प्राप्त करूं?

मेरे लिए भेजने के लिए वन-वे सड़क हो रहा है ...

किसी एक छोटे से सी #/WPF कोड नमूने के साथ शुरुआत करने में मदद कर सकता है?

किसी भी मदद

उत्तर

15

IMHO यह NotificationMessageAction<T> उपयोग करने के लिए के रूप में यह इस कार्य के लिए बाहर कट जाता है बेहतर है।

इस तरफ:

var msg = new NotificationMessageAction<MessageBoxResult>(this, "GetPassword", (r) => 
{ 
    if (r == MessageBoxResult.OK) 
    { 
     // do stuff 
    } 
}); 

Messenger.Default.Send(msg); 

और रिसीवर की ओर:

Messenger.Default.Register<NotificationMessageAction<MessageBoxResult>>(this, (m) => 
{ 
    if (m.Notification == "GetPassword") { 
     var dlg = new PasswordDialog(); 
     var result = dlg.ShowDialog(); 
     m.Execute(result); 
    } 
}); 

मुझे विश्वास है कि इस दृष्टिकोण क्लीनर है यह ViewModel करने के लिए दृश्य से एक अनावश्यक निर्भरता पैदा नहीं करता के रूप में (हालांकि इस तरह दौर इतना बुरा नहीं है)। बेहतर पठनीयता के लिए NodificationMessageAction<MessageResult> उप-वर्गीकरण पर विचार करें। अर्थात।

public class ShowPasswordMessage : NotificationMessageAction<MessageBoxResult> 
{ 
    public ShowPasswordMessage(object Sender, Action<MessageBoxResult> callback) 
     : base(sender, "GetPassword", callback) 
    { 

    } 
} 

तो इस

var msg = new ShowPasswordMessage(this, (r) => 
{ 
    if (r == MessageBoxResult.OK) 
    { 
     // do stuff 
    } 
}); 

Messenger.Default.Send(msg); 

और रिसीवर की ओर

Messenger.Default.Register<ShowPasswordMessage>(this, (m) => 
{ 
    var dlg = new PasswordDialog(); 
    var result = dlg.ShowDialog(); 
    m.Execute(result); 
}); 

एक बहुत स्पष्ट हो जाता है।

और verry महत्वपूर्ण प्राप्तकर्ता को अनधिकृत करें अन्यथा आप एक स्मृति रिसाव बना सकते हैं।

+2

+1: आपके उत्तर ने बहुत मदद की! अच्छी व्याख्या के लिए धन्यवाद। अपंजीकृत मुद्दे के बारे में भी नहीं पता था। दुर्भाग्यवश मुझे एमवीवीएम-लाइट, केवल कुछ ब्लॉग और उदाहरण कोड के लिए कोई अच्छा और पूर्ण दस्तावेज नहीं मिला। – nabulke

+0

महान काम करता है। एक छोटी सी त्रुटि: यह वर संदेश = नए ShowPasswordMessage (यह, (आर) => 'इस पक्ष पर होना चाहिए शायद आप भविष्य में संदर्भ के लिए इसे संपादित कर सकते (मैं काफी विशेषाधिकार नहीं हैं) – nabulke

+1

@nabulke:। लॉरेंट के ब्लॉग http://www.galasoft.ch पर कुछ अच्छे उदाहरण हैं। इसके अलावा उनके Mix 2010 वीडियो MVVM प्रकाश शुरू करने के लिए बहुत जरूरी है। पोस्ट का संपादन किया। – AxelEckenberger

1

रजिस्टर विधि में करने के लिए धन्यवाद आप एक संवाद दिखाने के लिए और YourViewModel संदर्भ पारित कर सकते हैं।

Messenger.Default.Register<YourViewModel>(this, "showDialog", viewModel=> 
     { 
      var dlg = new Dialog();   
      viewModel.Result = dlg.ShowDialog();             
     }); 

अपने कोड में कहीं न कहीं आप इस तरह YourViewModel के लिए एक संदर्भ के साथ() संदेश भेजें फेंक सकता:

Messenger.Default.Send(viewModel, "showDialog"); 
+0

Messenger.Default.Send() एक अतुल्यकालिक समारोह, है न तुरंत लौटने? तो मुझे कैसे पता चलेगा कि संवाद कब बंद है और परिणाम पूछे जा सकते हैं? – nabulke

+0

क्या मैं कॉलबैक फ़ंक्शन या ऐसा कुछ उपयोग कर सकता हूं? मैं थोड़ा उलझन में हूँ। – nabulke

+0

भेजें() फ़ंक्शन लैम्बडा को ट्रिगर करेगा जहां आपका संवाद पॉप अप हो जाएगा। चूंकि यह मोडल डायलॉग (शोडियलॉग विधि) है, यह वर्कफ़्लो को बंद होने तक अवरुद्ध कर देगा। – Arseny

0

आदेश में DialogMessage का उपयोग कर के रूप में शीर्षक से पता चलता ऊपर प्राप्त करने के लिए, एक निम्न का उपयोग कर सकते हैं:

इस पक्ष:

void SendMessage(String msgText) 
{ 
    DialogMessage messege = new DialogMessage(msgText, res => 
     { 
      callback(res); 
     }) 
    //set more dialog properties using the Initializer 
    { Button = MessageBoxButton.OKCancel, Caption = "" }; 

    Messenger.Default.Send(messege, "mb1"); 
} 

public void callback(MessageBoxResult res) 
{ 
    if (res == MessageBoxResult.OK) 
    { /*do something*/ } 
} 

रिसीवर की ओर:

void Rec() 
{ 
    Messenger.Default.Register<DialogMessage>(
     this, "mb1", msg => ShowDialog(msg)); 

    Unloaded += Unreg; 
} 

void ShowDialog(DialogMessage msg) 
{ 
    var result = MessageBox.Show(
     msg.Content, 
     msg.Caption, 
     msg.Button); 
    msg.Callback(result); 
} 

स्पष्ट रिसीवर की अंतिम पंक्ति में कॉलबैक विधि पर कॉल करें।

msg.Callback(result); 
संबंधित मुद्दे