2011-05-09 11 views
7

का उपयोग कर डब्ल्यूपीएफ में व्यूमोडेल से दृश्य को कैसे अपडेट करें I अपनी पहली परियोजना के लिए एमवीवीएम डिज़ाइन के साथ डब्लूएफपी का उपयोग कर रहा हूं और मुझे इकाई को अद्यतन करने के लिए क्लाइंट से कमांड को संसाधित करने के बाद दृश्य को अपडेट करने में समस्या आ रही है। इस समय, दृश्य व्यूमोडेल से बात कर सकता है लेकिन व्यूमोडेल वापस देखने के लिए बात नहीं कर सका। किसी को भी यह पता है कि यह कैसे काम करता है? धन्यवाद, Jdangएमवीवीएम डिज़ाइन

+0

बहुत खेद है, लेकिन क्या आपने इस समस्या का समाधान किया है? मैं उसी में फंस गया .. – curiousity

उत्तर

3

आपको व्यूमोडेल लागू करना चाहिए IotifyProperty को बदलें और ViewModel गुणों को बदलते समय PropertyChanged ईवेंट को आग लगाना चाहिए। यह मानते हुए कि यूआई ViewModel गुणों से जुड़ा हुआ है, इसे काम करना चाहिए।

2

एक विशिष्ट एमवीवीएम अनुप्रयोग में, आप व्यूमोडेल को दृश्य को जोड़ने के लिए बाइंडिंग का उपयोग करते हैं। 0Mइंटरफ़ेस द्वारा परिभाषित, ViewModel PropertyChanged ईवेंट को उठाते समय बाइंडिंग स्वचालित रूप से अपडेट हो जाते हैं। तो आपको ViewModel में उस इंटरफ़ेस को लागू करने और PropertyChanged ईवेंट को बढ़ाने की आवश्यकता है जब किसी संपत्ति का मूल्य बदला जाता है, और दृश्य स्वचालित रूप से परिवर्तन को प्रतिबिंबित करेगा।

+0

हां, मैं INotifyProperty को लागू करता हूं और संपत्ति चेंज किए गए ईवेंट को आग लगाता हूं लेकिन दृश्य में कुछ भी नहीं बदलता है। क्या मुझे कुछ विशेष रूप से देखने की ज़रूरत है। वर्तमान में यहां मेरे पास – AustinTX

+0

है हां, मैं INotifyProperty को लागू करता हूं और संपत्ति चेंज किए गए ईवेंट को आग लगाता हूं लेकिन दृश्य में कुछ भी नहीं बदलता है। क्या मुझे कुछ विशेष रूप से देखने की ज़रूरत है। वर्तमान में मेरे पास मेरे xaml टेक्स्ट = "{बाध्यकारी उपयोगकर्ता के लिए क्या है।UserName, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} "। क्या आपके पास एक नज़र डालने के लिए कोई उदाहरण है? – AustinTX

+0

यह आपके पास जो कुछ है उसके साथ काम करना चाहिए ... क्या आप अधिक कोड शामिल करने के लिए अपना प्रश्न संपादित कर सकते हैं? –

3

यदि आप MVVM पैटर्न के लिए नए हैं, मैं MSDN से उत्कृष्ट रूप में संसाधनों है कि दोनों पैटर्न और कैसे WPF और सिल्वरलाइट अनुप्रयोगों में इसे लागू करने को कवर निम्नलिखित की सिफारिश:

  1. Implementing the MVVM Pattern
  2. Advanced MVVM Scenarios

आप क्या कहा है, यह लग रहा है कि आप की समीक्षा करने के data binding चाहते हो सकता है की तरह है, और आप INotifyPropertyChanged, INotifyCollectionChanged, एक कैसे लाभ उठा सकते हैं के आधार पर डी ICollectionView इंटरफेस आपके विचारों के बीच दो-तरफा संचार सक्षम करने और मॉडल देखने के लिए।

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

+0

हाँ, मैं लागू करता हूं INotifyPropertyChanged और PropertyChanged ईवेंट को आग लगाना लेकिन दृश्य में कुछ भी बदलाव नहीं है। क्या मुझे कुछ विशेष रूप से देखने की ज़रूरत है। वर्तमान में यहां मेरे पास टेक्स्ट = "{बाध्यकारी उपयोगकर्ता। उपयोगकर्ता नाम, मोड = दोवे, अपडेटसोर्स ट्रिगर = प्रॉपर्टी चेंज किया गया}" – AustinTX

+1

आपका बाध्यकारी प्रतीत होता है। क्या आपने सत्यापित किया है कि जब कोई उपयोगकर्ता नाम संपत्ति को ब्रेकपॉइंट सेट करके बदल दिया जाता है तो संपत्तिChanged उठाया जा रहा है? साथ ही, दो बार जांचें कि आप जिस संपत्ति को उठा रहे हैं उसका टेक्स्ट नाम आपके संपत्ति के नाम से बिल्कुल मेल खाता है। अपना विचार पोस्ट करें और यदि आप चाहते हैं तो मॉडल देखें, जो आपकी समस्या को डीबग करने में मदद करेगा। – Oppositional

1

अन्य उत्तर के अलावा में, मैं भी अपने ViewModels का विस्तार DependencyObject होने सुझाव है।

कुछ लोग मानते हैं कि निर्भरता ऑब्जेक्ट्स भारी वजन (और यदि आप उनमें से हजारों उदाहरण बनाते हैं) और नए उपयोगकर्ताओं के लिए थोड़ा जटिल हो सकता है (निश्चित रूप से ऐसी स्थितियां हैं जहां यह सच है)। हालांकि, निर्भरता ऑब्जेक्ट्स के अन्य फायदे हैं, जैसे संपत्ति परिवर्तन अधिसूचना के लिए स्वचालित समर्थन और बाध्यकारी मूल्यांकन की गति। (सी में DependencyProperty.snippet रूप में सहेजें: \ [यहाँ अपना नाम] उपयोगकर्ता \ Documents \ दृश्य स्टूडियो [2010, 2008] \ कोड स्निपेट्स \ विजुअल C# \ मेरे कोड स्निपेट):

यहाँ मेरी डी पी स्निपेट

<?xml version="1.0" encoding="utf-8"?> 
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
    <Header> 
     <SnippetTypes> 
     <SnippetType>Expansion</SnippetType> 
     </SnippetTypes> 
     <Title>SnippetFile1</Title> 
     <Author>will</Author> 
     <Description> 
     </Description> 
     <HelpUrl> 
     </HelpUrl> 
     <Shortcut>dp</Shortcut> 
    </Header> 
    <Snippet> 
     <Declarations> 
     <Literal Editable="true"> 
      <ID>PropertyName</ID> 
      <ToolTip>Property name</ToolTip> 
      <Default>PropertyName</Default> 
      <Function> 
      </Function> 
     </Literal> 
     <Literal Editable="false"> 
      <ID>ClassName</ID> 
      <ToolTip>Class name</ToolTip> 
      <Default>ClassName</Default> 
      <Function>ClassName()</Function> 
     </Literal> 
     <Literal Editable="true"> 
      <ID>Type</ID> 
      <ToolTip>Property type</ToolTip> 
      <Default>object</Default> 
      <Function> 
      </Function> 
     </Literal> 
     <Literal Editable="true"> 
      <ID>DefaultValue</ID> 
      <ToolTip>Default value</ToolTip> 
      <Default>null</Default> 
      <Function> 
      </Function> 
     </Literal> 
     </Declarations> 
     <Code Language="csharp"><![CDATA[#region $PropertyName$ 
/// <summary> 
/// The <see cref="DependencyProperty"/> for <see cref="$PropertyName$"/>. 
/// </summary> 
public static readonly DependencyProperty $PropertyName$Property = 
    DependencyProperty.Register(
     $PropertyName$Name, 
     typeof($Type$), 
     typeof($ClassName$), 
     new UIPropertyMetadata($DefaultValue$)); 

/// <summary> 
/// The name of the <see cref="$PropertyName$"/> <see cref="DependencyProperty"/>. 
/// </summary> 
public const string $PropertyName$Name = "$PropertyName$"; 

/// <summary> 
/// $end$ 
/// </summary> 
public $Type$ $PropertyName$ 
{ 
    get { return ($Type$)GetValue($PropertyName$Property); } 
    set { SetValue($PropertyName$Property, value); } 
} 
#endregion ]]></Code> 
    </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 
+0

मैं सहमत हूं कि आप निर्भरता ऑब्जेक्ट का उपयोग करके कुछ प्रदर्शन लाभ प्राप्त करें, बी क्योंकि वे उस धागे से बंधे हैं जो वे बनाए गए थे और निर्भरता वस्तुएं क्रमबद्ध नहीं हैं। कुछ मामलों में वे निश्चित रूप से जाने का तरीका हैं, लेकिन आम तौर पर अधिसूचना इंटरफेस के साथ एक पीओसीओ का उपयोग करने के लिए यह सुरक्षित (और अभी भी अपेक्षाकृत निष्पादक) है। – Oppositional

+0

रुचि रखने वालों के लिए, http://msdn.microsoft.com/en-us/library/bb613546.aspx#HowDataBindingReferencesAreResolved प्रदर्शन प्रभावों पर सभ्य जानकारी प्रदान करता है विल के बारे में बात कर रहे हैं। – Oppositional