2010-09-21 11 views
15

मैं एमवीवीएम पैटर्न के साथ एक नेटवर्क डब्ल्यूपीएफ एप्लीकेशन विकसित कर रहा हूं और ऐसा लगता है कि यह डिजाइनर में सर्वरों को चला रहा है और कनेक्ट कर रहा है।मैं अपने व्यूमोडेल कोड को डिज़ाइनर में चलाने से कैसे रोकूं?

मुझे IsInDesignMode संपत्ति के बारे में पता है, लेकिन मुझे यकीन नहीं है कि इसे ViewModel में कैसे एक्सेस किया जाए।

उत्तर

28
DependencyObject dep = new DependencyObject(); 
if (DesignerProperties.GetIsInDesignMode(dep)) 
{ 
    ... 
} 
3

इस तरह अपने XAML में एक डिजाइन समय डेटा स्रोत रखो:

<UserControl x:Class="Company.Product.View.MyView" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:vm="clr-namespace:Company.Product.ViewModel.Design" 
xmlns:design_vm="clr-namespace:Company.Product.ViewModel.Design" 
mc:Ignorable="d" Name="MyView"> 
<UserControl.Resources> 
    <ObjectDataProvider ObjectType="{x:Type design_vm:MyViewModel}" x:Key="DesignTime_DataSource" d:IsDataSource="True"/> 
</UserControl.Resources> 
<Grid d:DataContext="{StaticResource DesignTime_DataSource}"> 
.... 
</Grid> 
</UserControl> 

अपने डिजाइन समय रन टाइम viewmodel से विरासत viewmodel, लेकिन निर्माता में डेटा नकली हैं। आपको अपने रन टाइम व्यू मॉडल में कुछ भी करना पड़ सकता है, इसलिए डिज़ाइन टाइम व्यूमोडेल डेटा एक्सेस कोड नहीं चलाता है।

+0

ऐसा लगता है जब दृश्य स्टूडियो क्रैश हो जाता है जब व्यूमोडेल में एक अनचाहे अपवाद होता है। –

+0

मेरा अनुभव यह है कि डिजाइन-खिड़की पूरी तरह से स्टूडियो नहीं, शानदार ढंग से दुर्घटनाग्रस्त हो जाती है। – Guge

1

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

+0

एमएवीएम पर जोश स्मिथ के लेख में एक्सएएमएल में सभी बाध्यकारी किया जाता है। –

4

मैं कोड है कि मैं केवल आवेदन रनटाइम पर निष्पादित कर सकते हैं और नहीं तो XAML डिजाइनर में एक अपवाद का कारण होता है चारों ओर निम्न कथन का उपयोग करें।

 if (System.Windows.Application.Current.MainWindow != null) 
16

बस इन सुझावों को जोड़ने के लिए, आप शायद उत्पादन परिनियोजन के लिए अनुकूलित करना चाहते हैं।

यदि आपको व्यूमोडेल में डिज़ाइन मोड की जांच करने की आवश्यकता है, तो आपको केवल DEBUG मोड में ऐसा करना चाहिए, अन्यथा रिलीज़ संस्करण को हमेशा अनावश्यक जांच करना होगा।
विकासशील होने पर, यदि डिज़ाइन मोड में आप विधि से बाहर निकल सकते हैं (या यहां तक ​​कि कुछ नकली डेटा भी निकाल सकते हैं)।

अपने निर्माता की पहली पंक्ति के रूप में इस कोड डाल (या जो भी कोड बुलाया जा रहा है):

सी #:

#if DEBUG 
    if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return; 
#endif 

वीबी:

#If DEBUG Then 
    If DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then Return 
#End If 
5

मैं सोचा कि मैं इसमें जोड़ दूंगा क्योंकि मैंने कुछ ऐसा देखा है जिसे मैंने वीएस2015 में देखा था और यह एक वैकल्पिक soluti प्रदान करता है पर। डिजाइनर में "प्रोजेक्ट कोड अक्षम करें" के लिए एक बटन है।

मैं यह धारणा कर रहा हूं कि आपका ViewModel तत्काल हो रहा है और आपके कोड से सामान कर रहा है। मुझे पता है कि यह शुद्ध एमवीवीएम तोड़ता है, लेकिन मैंने देखा है कि बहुत से लोग पीछे कोड में कन्स्ट्रक्टर के भीतर DataContext = new MyViewModel(); जैसी चीजें करते हैं।

इस बटन को टॉगल करना उस समस्या को हल करना चाहिए और आपके कोड क्लीनर को रखने में मदद करता है। अधिक जानकारी के लिए चेकआउट MSDN

यहां एमएसडीएन दस्तावेज से छवि है ताकि आप जान सकें कि यह कैसा दिखता है। मुझे यकीन है कि लिंक अंततः तोड़ देगा, वैसे भी।

enter image description here

मैं VS2015 में इस देखा है, लेकिन यकीन है कि कौन-सा संस्करण इस सुविधा जोड़ा गया है नहीं।

एक साइड नोट के रूप में, यह डिजाइनर को फिर से लोड करने के लिए एक अच्छा तरीका के रूप में भी दोगुना हो जाता है। जब मैंने कोशिश की तो धीमी गति से यद्यपि। आपका मिलेज भिन्न हो सकता है।

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

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