MVVM ilə WPF-də söhbətlərin aparılması

WPF üçün MVVM şablonunda, informasiya dialoqları ən mürəkkəb əməliyyatlardan biridir. Təqdimat modeliniz nümayəndəlik haqqında bir şey bilmirsə, dialoq maraqlı ola bilər. Görüşü çağırdığımda informasiya qutusu göründüyü zaman ICommand'ı aça bilərəm.

Hər kəs dialoqdan nəticə çıxarmaq üçün yaxşı bir yol bilirmi? MessageBox kimi Windows dialoqlarından bəhs edirəm.

Bunu etdiyimiz yollardan biri dialoq tələb olunduqda imzalanacaq təqdimat modelində bir hadisədir.

18 янв. Ray Booysen tərəfindən 18 yanvarda təyin olundu 2009-01-18 12:23 '09 at 12:23 2009-01-18 12:23
ответ 21 cavab

1990-cı modal dialoqlardan imtina etməyi təklif edirəm və bunun yerinə virtual maşındakı mantıksal dönüşə bağlı görünürlüğüyle nəzarətin bir kəmər (kətan + mütləq yerləşdirmə) kimi tətbiq etməsini təklif edirəm. Ajax tipli idarəetməyə daha yaxındır.

Bu çox faydalıdır:

 <BooleanToVisibilityConverter x:Key="booltoVis" /> 

kimi:

 <my:ErrorControl Visibility="{Binding Path=ThereWasAnError, Mode=TwoWay, Converter={StaticResource booltoVis}, UpdateSourceTrigger=PropertyChanged}"/> 

Bir istifadəçi nəzarəti olaraq bunu necə tətbiq edirəm. "X" düyməsinə basaraq, usercontrol kodunda kod satırında nəzarətini bağlayır. (DLL'də .exe və ViewModels'lerdeki görüşlərim olduğundan, istifadəçi interfeyasını idarə edən kodu haqqında pis hiss etmirəm.)

2019

130
08 мая '09 в 19:36 2009-05-08 19:36 Cavab Cef K. tərəfindən mayın 08-də saat 19: 36-da verilir. 2009-05-08 19:36

Bunu etmək üçün vasitəçilik etməlisiniz. Vasitəçi, bəzi tətbiqlərdə də xəbərdar kimi tanınan ümumi dizayn nümunəsidir. Bu, bir Qeyd / Bildiriş paradiqmasıdır və ViewModel və fikirlərinizə aşağı bağlayıcı jitters istifadə edərək qarşılıqlı istifadə etməyə imkan verir.

Google WPF Disciples qrupunu yoxlamalı və yalnız bir satıcıya müraciət etməlisiniz. Cavabdan çox məmnun olacaqsınız ...

Bununla belə başlaya bilərsiniz:

http://joshsmithonwpf.wordpress.com/2009/04/06/a-mediator-prototype-for-wpf-apps/

border=0

Enjoy!

Düzenle: Burada MVVM Light Toolkit istifadə edərək, bu problemin cavabını görə bilərsiniz:

http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338

49
17 апр. Roubachof tərəfindən 17 apreldə cavab verildi 2009-04-17 13:06 '09 at 13:06 pm 2009-04-17 13:06

Yaxşı MVVM dialoqu olmalıdır:

  • XAML ilə yalnız elan edilir.
  • Bütün məlumatları bağlamadan alın.

Təəssüf ki, WPF bu xüsusiyyətləri təmin etmir. ShowDialog () kodunu çağırmaq, informasiya qutusunu göstərmək üçün tələb olunur. Dialoqları dəstəkləyən pəncərə sinfi XAML-də elan edilə bilməz, belə ki, asanlıqla DataContext ilə bağlı ola bilməz.

Bu problemi həll etmək üçün mən məntiqi ağacın içindəki XAML nəzarətini yazdım və pəncərə məlumatlarını bağlayır və ekranın görünüşünü və informasiya qutusunun gizləndiyini görürəm. Buradan da tapa bilərsiniz: http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

Istifadə etmək həqiqətən asandır və ViewModel-də qəribə dəyişikliklər tələb etmir və hadisələr və ya mesajlar tələb etmir. Əsas problem aşağıdakılardır:

 <dialog:Dialog Content="{Binding Path=DialogViewModel}" Showing="True" /> 

Yəqin ki göstərilən bir stil əlavə etmək istəyirsən. Bunu məqaləmdə izah edirəm. Bu sizə kömək edir.

25
18 апр. user92541 tərəfindən verilmiş cavab 18 aprel 2009-04-18 19:41 '09 da 19:41 'da 2009-04-18 19:41

MVVM ilə söhbət üçün bu yanaşımı istifadə edirəm.

Bilmirəm, mənim baxış modelimdən aşağıdakıları axtarın.

21
10 февр. cümə axşamı cümə günü cavab verildi 2011-02-10 14:01 '11 at 2:01 pm 2011-02-10 14:01

Hal-hazırda həll etdiyiniz problemlərin əksəriyyətini həll edir, lakin platformanın konkret işlərindən tamamilə öz əksini tapır və yenidən istifadə edilə bilər. Ayrıca, kod bağlamasını yalnız ICommand'ı uygulayan DelegateCommands'a bağlamaq üçün kullanmadım. Dialoq, əsasən ViewModel-ə malik ayrı bir nəzarətdir və əsas ekranın ViewModel-dən nümayiş olunur, lakin DelagateCommand bağlanması istifadəçi interfeysindən başlayır.

MVVM və Silverlight 4 ilə modal dialoqlar burada tam Silverlight 4 həll baxın

16
22 янв. Cavab 22 yanvarda Roboblob tərəfindən verildi . 2010-01-22 00:14 '10 at 0:14 2010-01-22 00:14

MVVM-ni öyrənərkən həqiqətən də bu anlayışla mübarizə aparırdım. Nə qərar verdim və düşünürəm ki, başqaları artıq qərar vermişdilər, ancaq mənə aydın deyildir:

Mənim ilk düşüncəm ki, ViewModel informasiya qutusunun necə görünməsinə qərar verən bir işə malik olmadığı üçün, informasiya qutusuna birbaşa daxil olmamağa icazə verməməlidir. Buna əsasən, MVP (məsələn, View.ShowSaveFileDialog ()) kimi mesajların necə ötürülməsi barədə düşünməyə başladım. Ancaq bunun yanlış bir yanaşma olduğunu düşünürəm.

OK, ViewModel birbaşa dialoq çağırır. Ancaq ViewModel'i test etdirdiyiniz zaman, bu dialoq zamanı testin açılacağı və ya birlikdə çalışmayacağı anlamına gəlir (heç vaxt onu sınamadı).

Beləliklə, test zamanı nə baş verə bilər, dialoqun "test" versiyasını istifadə etməlisiniz. Bu deməkdir ki, hər hansı bir informasiya qutusunda bir interfeys yaratmaq və ya informasiya cavabına cavab vermək və ya standart bir davranışa sahib olan bir test düzeni yaratmaq lazımdır.

Zəngin bir kontekstdən asılı olaraq doğru versiyanı təmin etmək üçün xüsusi bir növ xidmət lokatoru və ya IoC istifadə etməlisiniz.

Bu yanaşmanı istifadə edərək, ViewModel hələ də yoxlanıla bilər və sizin dialoqlarınızda necə təhqir etdiyinə görə davranışınızı idarə edə bilərsiniz.

Bu kömək edir.

6
04 марта '10 в 3:28 2010-03-04 03:28 Mike Rowley- ə 04 mart 2010-cu ildə cavab verən 3:28 2010-03-04 03:28

Bunu etmək üçün iki yaxşı yol var: 1) dialoq xidməti (sadə, təmiz) və 2) yardımı nəzərdən keçirin. Göründüyü köməkçi bir sıra səliqəli xüsusiyyətləri təmin edir, lakin adətən buna dəyər deyil.

XİDMƏTİ DİALOG

a) dialoq xidməti interfeysi, məsələn bir konstruktor və ya bir neçə asılılıq konteyneri vasitəsilə:

interface IDialogService { Task ShowDialogAsync(DialogViewModel dlgVm); }

b) IDialogService tətbiqiniz bir pəncərəni açmalıdır (ya da aktiv pəncərədə bir nəzarət daxil edin), dlgVm (qeydiyyat və ya konteyner müqaviləsini və ya ContentPresenter-in müvafiq DataTemplates növündən istifadə edin) adına uyğun bir görünüş yaradır, ShowDialogAsync bir TaskCompletion obyekti yaratmalı və onu qaytarmalıdır. Tapşırıq saxlama. DialogViewModel sinfi özü yaxınlaşdığınız zaman törətdiyi bir sinifdə zəng edə biləcəyiniz bir hadisə tələb edir və dialoqu həqiqətən yaxınlaşdırmaq / gizlətmək və TaskCompletionSource'u bitirmək üçün informasiya qutusuna baxmaq lazımdır.

b) Istifadə etmək üçün sadəcə bu DialogViewModel tərəfindən yaradılan bəzi sinifdə bu.DialogService.ShowDialog (myDlgVm) gözləyin. Geri dönməyi gözlədikdən sonra, nə olduğunu təyin etmək üçün VM dialoqunuza əlavə etdiyiniz xüsusiyyətləri nəzərdən keçirin; hətta geri çağırışa ehtiyacınız yoxdur.

YARDIM EDİN

Viewmodel bir hadisə dinləmək, sizin fikriniz. Bütün bunlar, kodunuzu istifadə etməmək və çox meylli olduqda resurslardan istifadə etmək üçün Blend Davranışında tamamlana bilər (FMI, steroidlərdə qarışıq əlavə xüsusiyyətlərin növünü görmək üçün Davranış sinifinin alt sinfi). İndi hər bir növü üçün əl ilə edəcəyik:

a) Xüsusi yüklənmə ilə (OpenGlass DialogViewModel) bir OpenXXXXXdialogEvent yaradın.

b) Görünüşün OnDataContextChanged hadisəsində bir hadisə yazıldığını düşünün. Köhnə dəyər! = Null və "Window Unloaded" halda isə abunəni gizlətməyi və ləğv etməyi unutmayın.

c) Bir hadisə tetiklendiğinde, sayfanızdaki bir kaynakta görünen bir görünümü keçirin və ya başqa bir yerde (məsələn, dialoq servisine yaklaşımda) görebilirsiniz.

Bu yanaşma daha çevikdir, lakin daha çox işi tələb edir. Mən çox istifadə etmirəm. Gözəl üstünlüklərdən biri, məsələn, görünüşü fiziki olaraq sekmənin içərisinə yerləşdirmə qabiliyyətidir. Mən mövcud istifadəçi nəzarət sərhədlərinə yerləşdirmək üçün kifayət qədər böyük bir konteyner tapılana qədər vizual ağacdan keçmək üçün kifayət qədər böyük olmayan bir alqoritm istifadə etdim.

Bu, dialoqların həqiqətən istifadə olunduğu yerə yaxın olmasına imkan verir, yalnız mövcud fəaliyyətlə əlaqəli tətbiqin bir hissəsini azaldır və istifadəçinin müxtəlif sekmeler və ya alt görünüşlərdə, bir neçə kvazimodal dialoqlarda da olsa, dialoqları əlindən uzaqlaşdırmadan tətbiqə getməyə imkan verir.

4
21 марта '15 в 12:25 2015-03-21 12:25 Cavab Chris Bordeman tərəfindən 21 Mart 'da saat 12:25' də veriləcəkdir 2015-03-21 12:25

Dondurulmuş əmrdən istifadə edin

 <Grid> <Grid.DataContext> <WpfApplication1:ViewModel /> </Grid.DataContext> <Button Content="Text"> <Button.Command> <WpfApplication1:MessageBoxCommand YesCommand="{Binding MyViewModelCommand}" /> </Button.Command> </Button> </Grid> 
4
17 нояб. Cavab 17-də Maxm007 verilir . 2011-11-17 21:16 '11 at 21:16 2011-11-17 21:16

ViewModel bir mesajı dinləyən bir davranış tətbiq etdim. Bu, Laurent Bugnion həllinə əsaslanır, amma kodu istifadə etmir və təkrar istifadə üçün daha münasibdir, mən onu daha zərif tapıram.

WPF'nin MVVM qutusundan dəstəkləndiyi kimi davranması necədir

3
06 февр. Cavab 06 fevral tarixində Elad Katz tərəfindən verilir. 2011-02-06 20:23 '11 at 20:23 2011-02-06 20:23

Niyə yalnız virtual maşında hadisə qaldırmır və hadisə görünüşündə abunəliyik? Bu proqram mantığını və təqdimatını ayrı-ayrılıqda dəstəkləyəcək və hələ də informasiya qutusu üçün bir uşaq pəncərəsindən istifadə etməyə imkan verir.

2
29 янв. Cavab 29 yanvarda Eric Grover tərəfindən verildi . 2011-01-29 21:25 '11 at 21:25 2011-01-29 21:25

Bununla bir qədər vaxt sərf etdikdən sonra nəhayət aşağıdakı həlli ilə gəldim. Bu yanaşmanın bir sıra əsas üstünlükləri aşağıdakılardır:

  • MVVM Light öz IDialogService .
  • View MVVM Light bağlantısını əlavə etmək lazım deyil.
  • VM təqdimat səviyyəsində hər hansı bir hərəkət etməməyə ehtiyac yoxdur. Siz PresentationFramework linkinə hətta ehtiyacınız yoxdur.
  • MVVM Light öz Messenger kanalını istifadə edir, buna görə təqdimat və VM səviyyəsi ayrıdır.
  • Geri dönüş dəyəri olan, məsələn, Yes / No suallar və ya OK / durumları ləğv edən dialoqları dəstəkləyir.
  • Xüsusi dialoqlar üçün dəstək.

IDialogService ( ViewModel layihəsinə daxil) tətbiq olunur:

 using System; using System.Linq; using System.Threading.Tasks; namespace VM { public enum MessageBoxButtonVM { OK, OKCancel, YesNo } public enum MessageBoxImageVM { None, Information, Question, Error } public class MessageBoxArgs { public MessageBoxButtonVM Buttons { get; set; } public MessageBoxImageVM Icon { get; set; } public string Title { get; set; } public string Message { get; set; } } //For custom dialogs that return a value public class MessageBoxNotificationWithAction<T> { private readonly Action<T> _callback; public MessageBoxArgs Notification { get; set; } public MessageBoxNotificationWithAction(MessageBoxArgs notification, Action<T> callback) { Notification = notification; CheckCallback(callback); _callback = callback; } public virtual void Execute(T argument) { _callback.Invoke(argument); } private static void CheckCallback(Delegate callback) { if (callback == null) { throw new ArgumentNullException(nameof(callback), "Callback must not be null"); } } } /// <summary> /// Provides an implementation-agnostic way of communicating with the user through dialog boxes. Clients must register for communication messages using /// MVVM Light messaging system. /// </summary> public class DialogService : GalaSoft.MvvmLight.Views.IDialogService { private static GalaSoft.MvvmLight.Messaging.IMessenger Messenger = GalaSoft.MvvmLight.Messaging.Messenger.Default; private string _ProductName = ""; public string ProductName { get { if (_ProductName == "") { //The following statement returns the Title attribute of the current assembly, as defined in project properties (Assembly Information dialog). var TitleAttrib = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributesData().First(x => x.AttributeType.Name == "AssemblyTitleAttribute"); if (TitleAttrib != null) { _ProductName = TitleAttrib.ConstructorArguments[0].Value.ToString(); } else { _ProductName = "Default Application Name"; } } return _ProductName; } } public Task ShowError(Exception error, string title, string buttonText, Action afterHideCallback) { return ShowError(error.Message, title, buttonText, afterHideCallback); } public Task ShowMessage(string message, string title) { return Task.Run(() => MessengerSend(message, title, MessageBoxButtonVM.OK, MessageBoxImageVM.Error)); } public Task ShowError(string message, string title, string buttonText, Action afterHideCallback) { return Task.Run(() => { MessengerSend(message, title, MessageBoxButtonVM.OK, MessageBoxImageVM.Error); afterHideCallback?.Invoke(); }); } public Task ShowMessage(string message, string title, string buttonText, Action afterHideCallback) { return Task.Run(() => { MessengerSend(message, title); afterHideCallback?.Invoke(); }); } public Task<bool> ShowMessage(string message, string title, string buttonConfirmText, string buttonCancelText, Action<bool> afterHideCallback) { if ((buttonConfirmText == "OK"  buttonCancelText == "Cancel") || (buttonConfirmText == "Yes"  buttonCancelText == "No")) { return Task.Run<bool>(() => { MessageBoxButtonVM btn; if (buttonConfirmText == "OK") btn = MessageBoxButtonVM.OKCancel; else btn = MessageBoxButtonVM.YesNo; bool Response = false; Messenger.Send(new MessageBoxNotificationWithAction<bool>( new MessageBoxArgs() { Buttons = btn, Icon = MessageBoxImageVM.Question, Title = (string.IsNullOrEmpty(title) ? _ProductName : title), Message = message }, (result) => Response = result )); afterHideCallback?.Invoke(Response); return Response; }); } else throw new ArgumentException($"{nameof(buttonConfirmText)} and {nameof(buttonCancelText)} must either be OK/Cancel or Yes/No."); } /// <summary> /// For debugging purpose only /// </summary> /// <param name="message"></param> /// <param name="title"></param> /// <returns></returns> public Task ShowMessageBox(string message, string title) => ShowMessage(message, title); private void MessengerSend(string msg, string title = "", MessageBoxButtonVM btn = MessageBoxButtonVM.OK, MessageBoxImageVM icon = MessageBoxImageVM.Information) { Messenger.Send(new MessageBoxArgs() { Buttons = MessageBoxButtonVM.OK, Icon = MessageBoxImageVM.Information, Title = (string.IsNullOrEmpty(title) ? _ProductName : title), Message = msg }); } } } 

İşdə görünüş səviyyəsidir ( View layihəsinə daxil edilir)

 using System.Windows; using VM; namespace View { class DialogPresenter { private Window _Parent; public DialogPresenter() { //For simple information boxes GalaSoft.MvvmLight.Messaging.Messenger.Default.Register<MessageBoxArgs>(this, (arg) => ShowDialog(arg)); //For Yes/No or OK/Cancel dialog boxes. GalaSoft.MvvmLight.Messaging.Messenger.Default.Register<MessageBoxNotificationWithAction<bool>>(this, (arg) => arg.Execute(ShowDialog(arg.Notification))); //For notifications that require a string response (such as Manual Timeslot Description) GalaSoft.MvvmLight.Messaging.Messenger.Default.Register<MessageBoxNotificationWithAction<string>>(this, (arg) => arg.Execute(ShowStringInputDialog(arg.Notification.Title, arg.Notification.Message))); } private bool ShowDialog(MessageBoxArgs arg) { MessageBoxButton btn = MessageBoxButton.OK; MessageBoxImage ico = MessageBoxImage.None; switch (arg.Buttons) { case MessageBoxButtonVM.OK: btn = MessageBoxButton.OK; break; case MessageBoxButtonVM.OKCancel: btn = MessageBoxButton.OKCancel; break; case MessageBoxButtonVM.YesNo: btn = MessageBoxButton.YesNo; break; } switch (arg.Icon) { case MessageBoxImageVM.Error: ico = MessageBoxImage.Error; break; case MessageBoxImageVM.Information: ico = MessageBoxImage.Information; break; case MessageBoxImageVM.None: ico = MessageBoxImage.None; break; case MessageBoxImageVM.Question: ico = MessageBoxImage.Question; break; } bool Result = false; _Parent.Dispatcher.Invoke(() => { var Res = MessageBox.Show(arg.Message, arg.Title, btn, ico); Result = (Res == MessageBoxResult.OK || Res == MessageBoxResult.Yes); }); return Result; } private string ShowStringInputDialog(string title, string description, string value = "", int maxLength = 100) { string Result = null; _Parent.Dispatcher.Invoke(() => { //InputBox is a WPF Window I created for taking simple //string values from the user. This also shows that you can //any custom dialog using this approach. InputBox input = new InputBox(); input.Title = title; input.Owner = _Parent; if (input.ShowDialog(description, value, maxLength).Value) Result=input.Value; else Result=null; }); return Result; } //Call this somewhere at application startup so that the dialog boxes //appear as child windows. public void SetParentWindow(Window parent) { _Parent = parent; } } } 
2
08 нояб. Cavab dotNET 08 noyabr tarixində verilir. 2016-11-08 06:17 '16 'da 6:17' də 2016-11-08 06:17 'də

Maraqlı bir alternativ, baxışları (informasiya qutuları) göstərmək üçün məsul olan nəzarətçiləri istifadə edir.

Necə işləyir, WPF Application Framework (WAF) göstərilir .

2
21 марта '10 в 17:25 2010-03-21 17:25 Cavab 21 mart 2010 - cu il tarixində saat 17: 25-də verilir

Eyni vəziyyətə sahib oldum və MessageBox'u görünməz bir dizayner nəzarətində tamamladım. Mənim blogumda ətraflı məlumat

http://geekswithblogs.net/mukapu/archive/2010/03/12/user-prompts-messagebox-with-mvvm.aspx

Eyni modal dialoqlara, fayl görüntüləmə yoxlamalarına və s. Genişləndirilə bilər.

2
12 марта '10 в 0:30 2010-03-12 00:30 Cavab 12 mart 'da, saat 10.00' da Məkafu tərəfindən verilir. 2010-03-12 00:30

Hesab edirəm ki, dialoqun işlənməsi təqdimat üçün məsuliyyət daşımalıdır və təqdimat üçün kodu dəstəkləməlidir.

ViewModel-View qarşılıqlılığını dialoqlar işlətmək üçün dəyişdirirsinizsə, ViewModel bu tətbiqə bağlıdır. Bu problemlə məşğul olmaq üçün ən asan yol, məsələnin məsuliyyətini göstərməkdir. Bu bir dialoq göstərmək deməkdirsə, o zaman əla, ancaq vəziyyət barında statusu mesajı ola bilər və s.

Mənim fikrimcə, MVVM modelinin bütün nöqtəsi iş mantığını qrafik interfeysdən ayırmaqdır, buna görə də GUI-nin (dialoqun görünüşünü) iş layında (ViewModel) məntiqini çaşmamalıdır.

2
18 янв. Cavab 18 yanvarda Cameron MacFarland tərəfindən verilir 2009-01-18 12:36 '09 at 12:36 PM 2009-01-18 12:36

Bu sualın cavabında təsvir olunan öz pəncərə yükləyicisini yüklədim:

Bir tətbiqdə birdən çox WPF görünüşünü idarə etmək

1
28 апр. Mark Bostleman tərəfindən verilən cavabı Apr 28 2010-04-28 04:33 '10 at 4:33 2010-04-28 04:33

Görünüşün görünüş modelindən hadisəni idarə etmək üçün kodu ola biləcəyini düşünürəm.

Hadisəyə / ssenariyə bağlı olaraq, model hadisələri və cavab olaraq cavab vermək üçün bir və ya daha çox fəaliyyət göstərmək üçün abunə verən bir hadisə tetiği ola bilər.

1
24 апр. Nikhil Kothari 24 apreldə nəşr etdi 2009-04-24 04:39 '09 da 4:39 'da 2009-04-24 04:39

Karl Schifflett, xidmət anlayışı və Prism InteractionRequest yanaşmasını istifadə edərək informasiya qutularını göstərmək üçün bir nümunə proqram yaratdı.

Mən xidmətə yanaşmağı xoşlayıram - bu daha az çevikdir, buna görə istifadəçilər bir şeyləri pozmaq üçün daha az ehtimalı var :) Mənim tətbiqimin WinForms hissəsinə (MessageBox.Show) də uyğun gəlir. Lakin bir çox müxtəlif dialoq göstərməyi planlaşdırırsan, sonra InteractionRequest ən yaxşı yoludur. .

http://karlshifflett.wordpress.com/2010/11/07/in-the-box-ndash-mvvm-training/

1
12 дек. cavab verildi surfen 12 dekabr 2011-12-12 20:28 '11 saat 20:28 'də 2011-12-12 20:28

Mən bu köhnə bir sual olduğunu bilirəm, amma bu axtarışda bir çox əlaqəli suallar tapdım, amma həqiqətən dəqiq bir cavab tapmadım. Buna görə də, / messagebox / popin informasiya qutusunun öz tətbiqini edirəm və onu bölüşürəm!
Hesab edirəm ki, bu "MVVM sübutudur" və mən bunu sadə və düzgün etmək üçün çalışırıq, amma WPF-lər üçün yeniyim, beləliklə də şərhlərdən və hətta istəklərdən xahiş edirəm.

https://github.com/Plasma-Paris/Plasma.WpfUtils

Bunu aşağıdakı kimi istifadə edə bilərsiniz:

 public RelayCommand YesNoMessageBoxCommand { get; private set; } async void YesNoMessageBox() {var result = await _Service.ShowMessage("This is the content of the message box", "This is the title", System.Windows.MessageBoxButton.YesNo);if (result == System.Windows.MessageBoxResult.Yes)// [...] } 

Və ya daha mürəkkəb bir proqrama ehtiyacınız varsa:

 var result = await _Service.ShowCustomMessageBox(new MyMessageBoxViewModel {  }); 

Və belə şeyləri göstərir:

1
19 окт. Cavab 19 oktyabr Xav987 verilir . 2016-10-19 18:30 '16 saat 6:30 'da 2016-10-19 18:30 ' a qədər

Bir tapşırıq və ya informasiya qutusu üçün təqdimat modelinin necə göründüyünü soruşarkən bənzər bir problem düşünürdüm.

Mənim cari həllim bu kimi görünür:

Я боролся с той же проблемой. Я придумал способ взаимодействовать между View и ViewModel. Вы можете инициировать отправку сообщения из ViewModel в представление, чтобы сообщить ему, чтобы он отображал сообщение, и он будет отчитываться с результатом. Затем ViewModel может ответить на результат, возвращенный из представления.

Я демонстрирую это в мой блог :

0
ответ дан Jaco Karsten 28 марта '09 в 11:52 2009-03-28 11:52

EDIT: да, я согласен, что это не правильный подход MVVM, и теперь я использую нечто похожее на то, что предлагает blindmeis.

Один из способов сделать это:

В модели основного вида (где вы открываете модальный):

 void OpenModal() { ModalWindowViewModel mwvm = new ModalWindowViewModel(); Window mw = new Window(); mw.content = mwvm; mw.ShowDialog() if(mw.DialogResult == true) { // Your Code, you can access property in mwvm if you need. } } 

И в вашем Modal Window View/ViewModel:

XAML:

 <Button Name="okButton" Command="{Binding OkCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">OK</Button> <Button Margin="2" VerticalAlignment="Center" Name="cancelButton" IsCancel="True">Cancel</Button> 

ViewModel:

 public ICommand OkCommand { get { if (_okCommand == null) { _okCommand = new ActionCommand<Window>(DoOk, CanDoOk); } return _okCommand ; } } void DoOk(Window win) { <!--Your Code--> win.DialogResult = true; win.Close(); } bool CanDoOk(Window win) { return true; } 

или аналогично тому, что размещено здесь WPF MVVM: как закрыть окно

-1
ответ дан Simone 27 янв. '12 в 13:20 2012-01-27 13:20

Другие вопросы по меткам или Задайте вопрос