سؤال

سؤال MVVM. المراسلة بين ViewModel و View ، كيف يتم تنفيذها على أفضل وجه؟

يحتوي التطبيق على بعض نقاط "اتصال المستخدم" مثل: "لقد أدخلت تعليقات لهذا التحديد. هل ترغب في حفظ أو تجاهل "عندما تتغير قيمة اختيار نعم/لا/NA. لذلك أنا بحاجة إلى بعض الطرق المحظورة في العرض الملزم بـ "رسائل" ViewModel.

ذهبت إلى الطريق بدءًا من رسول MVVM Foundation. ومع ذلك ، فهذا أكثر من بث على مستوى النظام ثم نموذج الحدث/المشترك. لذلك ، إذا كان للتطبيق حالتين من عرض (person1 editview و person2 editview) افتح كلاهما يحصلان على الرسالة عندما ينشر One ViewModel رسالة "هل تريد حفظ".

ما هو النهج الذي استخدمته؟

شكرا آندي

هل كانت مفيدة؟

المحلول

لكل هذا ، يمكنك استخدام الربط كطريقة "الاتصال". على سبيل المثال ، قد يتم عرض رسالة التأكيد أو إخفاءها بناءً على الخصائص المحددة في ViewModel.

هذا هو المنظر

<Window.Resources>
     <BoolToVisibilityConverter x:key="boolToVis" />
</Window.Resources>
<Grid>

<TextBox Text="{Binding Comment, Mode=TwoWay}" />
<TextBlock Visibility="{Binding IsCommentConfirmationShown, 
                        Converter={StaticResource boolToVis}" 
           Text="Are you sure you want to cancel?" />

<Button Command="CancelCommand" Text="{Binding CancelButtonText}" />
</Grid>

وهنا هو ViewModel الخاص بك

// for some base ViewModel you've created that implements INotifyPropertyChanged
public MyViewModel : ViewModel 
{
     //All props trigger property changed notification
     //I've ommited the code for doing so for brevity
     public string Comment { ... }
     public string CancelButtonText { ... }
     public bool IsCommentConfirmationShown { ... }
     public RelayCommand CancelCommand { ... }


     public MyViewModel()
     {
          CancelButtonText = "Cancel";
          IsCommentConfirmationShown = false;
          CancelCommand = new RelayCommand(Cancel);
     }

     public void Cancel()
     {
          if(Comment != null && !IsCommentConfirmationShown)
          {
               IsCommentConfirmationShown = true;
               CancelButtonText = "Yes";
          }
          else
          {
               //perform cancel
          }
     }
}

هذه ليست عينة كاملة (الخيار الوحيد هو نعم! :)) ، ولكن نأمل أن يوضح هذا أن وجهة نظرك و ViewModel الخاصة بك هي كيان واحد تقريبًا وليس اثنان يجريان مكالمات هاتفية لبعضهما البعض.

أتمنى أن يساعدك هذا.

نصائح أخرى

ما يصفه أندرسون ربما يكفي للمتطلبات المعينة التي تصفها. ومع ذلك ، قد ترغب في النظر إلى تعبير مزيج السلوكيات التي توفر دعمًا قويًا للتفاعلات بين نماذج العرض ووجهات النظر ، والتي قد تكون مفيدة في سيناريوهات أكثر تعقيدًا - باستخدام الربط لـ "الرسائل" لن يحصل عليك إلا حتى الآن.

لاحظ أن مزيج التعبير SDK متاح مجانًا - ليس عليك استخدام مزيج التعبير لاستخدام SDK أو السلوك ؛ على الرغم من أن المزيج IDE لديه دعم أفضل في ثنائية المليء بـ "السحب والإسقاط" للسلوكيات.

أيضًا ، لاحظ أن كل "سلوك" هو مكون - بكلمة أخرى ، إنه نموذج قابل للتمديد ؛ هناك بعض السلوكيات المدمجة في SDK ، ولكن يمكنك كتابة سلوكياتك الخاصة.

فيما يلي بعض الروابط. (لاحظ ، لا تدع "Silverlight" في عنوان URL تضللك - يتم دعم السلوكيات لكل من WPF و Silverlight):

معلومة

مزج SDK

فيديو على السلوكيات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top