2010-03-02 14 views
14

मैं एमवीवीएम का उपयोग करने में देख रहा हूं और जब मैं इसे अधिकांश भाग में समझता हूं, तो एक चीज है जिसके बारे में मैं अपना सिर नहीं ले सकता।एमवीवीएम संवाद में डेटा पास करना मॉडल देखें

कल्पना कीजिए कि मेरे पास एक दृश्य और दृश्य मॉडल संयोजन है जो foobars की एक सूची दिखाता है। जब उपयोगकर्ता सूची में एक foobar का चयन करता है और संपादन बटन पर क्लिक करता है, तो मैं पॉपअप संवाद विंडो में foobar दिखाना चाहता हूं ताकि इसे संपादित किया जा सके। यह संवाद विंडो (दृश्य) का अपना स्वयं का व्यूमोडेल होगा।

मैं समझता हूं कि बटन को ViewModel सूची में कमांड से बाध्य किया जा सकता है, लेकिन यहां से मैं foobar संपादक को कैसे चालू करूं?

1) क्या मुझे दृश्य में एक संदेश वापस भेजना है, जो संवाद विंडो खोल देगा? यदि हां, तो क्या यह आदेश रखने का मकसद नहीं है?

2) फ़ोबबार संपादक के लिए व्यूमोडेल में कैसे जाता है? यदि यह अपने कन्स्ट्रक्टर द्वारा है, तो क्या एक्सएएमएल में व्यूमोडेल घोषित करना मुश्किल नहीं है?

मुझे लगता है कि यह पहेली का आखिरी टुकड़ा है जो मुझे एमवीवीएम का उपयोग करने से रोक रहा है और मैं वास्तव में इसके लिए एक अच्छा decoupled समाधान प्राप्त करना चाहता हूं।

धन्यवाद मैट

उत्तर

2

मैं शायद यह निम्नलिखित तरीके से करना होगा:

  1. आदेश संपादित करें बटन से जुड़ी संपादित करें संवाद शुरू होता है, इसके लिए एक कस्टम ViewModel (VM) का निर्माण। कमांड स्वयं या तो सूची के वीएम में या मॉडल में होना चाहिए (बिल्कुल यकीन नहीं)।
  2. Foobar संपादित करें संवाद के वीएम को इसके निर्माता पर फूबर का संदर्भ मिलता है।
  3. foobar क्लोन किया गया है और क्लोन संपादित किया गया है।
  4. जैसे ही उपयोगकर्ता foobar संपादन संवाद में ठीक दबाता है, क्लोन के मान VM में मूल foobar पर वापस लिखे जाते हैं (और संवाद बंद है)।

क्लोन की आवश्यकता इस तथ्य से आती है कि उपयोगकर्ता फ़ोबबार सूची में परिवर्तन नहीं देखना चाहता जब तक कि वह संपादन संवाद में परिवर्तन स्वीकार नहीं करता। यदि ऑनलाइन संपादन ठीक है, तो क्लोन की आवश्यकता नहीं है।

परिवर्तन स्वचालित रूप से प्रचारित होते हैं।

पीएस: हालांकि मैं एमवीवीएम के समर्थक हूं, मुझे यकीन नहीं है कि मेरा समाधान शुद्ध एमवीवीएम दृष्टिकोण से एक रूढ़िवादी है।

1

This article कोडप्रोजेक्ट से एक WPF संवाद नियंत्रण दिखाता है जो आपको वही करता है जो आपको चाहिए। इस कार्यान्वयन के लिए आवश्यक कारण यह है कि आप किसी अन्य नियंत्रण के दृश्य पेड़ के अंदर एक विंडो नहीं डाल सकते हैं। जिसका मतलब है कि डब्ल्यूपीएफ बॉक्स से बाहर आपको विंडो के अंदर एक संवाद बनाने की अनुमति नहीं देता है। तो उपरोक्त आलेख एक उपclass ContentControl बनाता है जो एक विंडो बनाता है।

फिर भी, आप अपने FooBarList देखें में रखते

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

आप सुनिश्चित करें कि आप कहीं एक संसाधन शब्दकोश में कुछ इस तरह किया है:

<Style TargetType="{x:Type dialog:Dialog}"> 
<Style.Triggers> 
    <Trigger Property="HasContent" Value="True"> 
    <Setter Property="Showing" Value="True" /> 
    </Trigger> 
</Style.Triggers> 
</Style> 

और बस कुछ इस तरह (WPF के लिए लिख काम करने के लिए आपको INotifyPropertyChanged को लागू करने की आवश्यकता है):

public Class FooBarListViewModel 
{ 
    IList<FooBar> FooBarList {get;set;} 
    FooBar SelectedFooBar {get;set;} 
    ViewModelBase DialogViewModel {get;set;} 

    public EditFooBar(object param) 
    { 
    DialogViewModel = FooBar; 
    } 
} 

Vie को लिंक करने के लिए (इसलिए यह वैश्विक है अधिमानतः Application.Resources में) w FooBar ViewModel को FooBar संपादित करने के लिए बस कुछ इस तरह करते हैं

<DataTemplate DataType={x:Type vm:FooBarViewModel}> 
    <vw:FooBarView/> 
</DataTemplate> 

(या वैकल्पिक रूप से: एक ViewModel like this post shows से अपने दृश्य को खोज निकालने में कनवर्ट करने के लिए एक IValueConverter का प्रयोग करें)

और फिर आप सेट हैं। बहुत कुछ लग सकता है, लेकिन यह वास्तव में आपको बहुत पसंद करता है।

+0

यह एक दिलचस्प दृष्टिकोण है। नमूना प्रोजेक्ट को देखते हुए मैं सोच रहा हूं कि क्या मैं सामान्य खिड़की (आकार बदलने, मॉडेलिस इत्यादि) की कुछ विशेषताओं को खोकर चुरा रहा हूं। मुझे लगता है कि यह एक ऐसा विचार करने पर विचार कर रहा है जो जटिल संवाद की आवश्यकता नहीं है - और शायद इसके बजाय एक एमडीआई आवेदन है। इस पर आपके विचार क्या हैं? – Matt

0

क्या गुम है एक नियंत्रक है जो ViewModels के वर्कफ़्लो के लिए ज़िम्मेदार है। नियंत्रक ViewModels बनाता है और यह ViewModels के बीच आवश्यक डेटा पास करता है।

WPF Application Framework (WAF) प्रोजेक्ट में नमूना अनुप्रयोग शामिल हैं जो दिखाते हैं कि यह कैसे काम कर सकता है।

संबंधित मुद्दे