WPF में डमी डिज़ाइन-टाइम डेटा के लिए कौन से दृष्टिकोण उपलब्ध हैं?


97

मैं अभिव्यक्ति मिश्रण के बिना काम कर रहा हूं और सिर्फ vs2010 में XAML संपादक का उपयोग कर रहा हूं। इस ओर ज्ञान, मैं तेजी से डिजाइन-टाइम डेटा बाइंडिंग की आवश्यकता देख रहा हूं। सरल मामलों के लिए, FallbackValueसंपत्ति बहुत अच्छी तरह से काम करती है (टेक्स्टबॉक्स और टेक्स्टब्लॉक, आदि)। लेकिन विशेष रूप से जब ItemsControlऔर इस तरह से व्यवहार करते हैं, तो किसी को वास्तव में डिजाइनर में दिखाई देने के लिए नमूना डेटा की आवश्यकता होती है ताकि आप निष्पादन योग्य चलाने के बिना नियंत्रण और डेटा टेम्पलेट को समायोजित और ट्विक कर सकें।

मुझे पता है कि ObjectDataProviderएक प्रकार के लिए बाध्य करने की अनुमति देता है, और इस प्रकार विज़ुअलाइज़ेशन के लिए डिज़ाइन-टाइम डेटा प्रदान कर सकता है, लेकिन फिर वास्तविक, रन-टाइम डेटा को दोनों डिज़ाइन समय को लोड करके संसाधनों को बर्बाद किए बिना बांधने के लिए अनुमति देने के लिए कुछ करतब दिखा रहा है, dummied डेटा और रनटाइम बाइंडिंग।

वास्तव में मैं जो चाह रहा हूं वह है, कहने की क्षमता, "जॉन", "पॉल", "जॉर्ज", और "रिंगो" एक्सएएमएल डिजाइनर में मेरे रूप में शैलीगत वस्तुओं के रूप में दिखते हैं ItemsControl, लेकिन जब आवेदन होता है तो वास्तविक डेटा दिखाते हैं रन।

मुझे यह भी पता है कि ब्लेंड कुछ फैंसी विशेषताओं के लिए अनुमति देता है जो डिजाइन टाइम बाइंडिंग डेटा को परिभाषित करता है जिसे रन-टाइम परिस्थितियों में WPF द्वारा प्रभावी रूप से अनदेखा किया जाता है।

तो मेरे सवाल हैं:

1. मैं दृश्य स्टूडियो XAML डिजाइनर में संग्रह और गैर-तुच्छ डेटा के डिज़ाइन-टाइम बाइंडिंग का लाभ कैसे उठा सकता हूं और फिर रनटाइम बाइंडिंग को आसानी से स्वैप कर सकता हूं?

2. दूसरों ने इस डिज़ाइन-टाइम बनाम रनटाइम डेटा समस्या को कैसे हल किया है? मेरे मामले में, मैं बहुत आसानी से दोनों के लिए एक ही डेटा का उपयोग नहीं कर सकता (जैसा कि एक डेटाबेस क्वेरी के साथ कह सकता है)।

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

जवाबों:


120

VS2010 का उपयोग करके आप डिज़ाइन-टाइम विशेषताओं (SL और WPF दोनों के लिए काम करता है) का उपयोग कर सकते हैं । मेरे पास आम तौर पर वैसे भी एक नकली डेटा-स्रोत होता है इसलिए यह केवल एक मामला है:

  • नाम स्थान की घोषणा को जोड़ना

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  • विंडो / नियंत्रण संसाधनों के लिए मॉक डेटा संदर्भ जोड़ना

    <UserControl.Resources>
      <ViewModels:MockXViewModel x:Key="DesignViewModel"/>
    </UserControl.Resources>
  • डिज़ाइन-टाइम डेटा संदर्भ सेट करना

    <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ...

काफी अच्छी तरह से काम करता है।


2
यदि आपको इस समस्या का उपयोग करने में समस्या d:DataContextहो रही है , तो इस प्रश्न में कुछ मदद मिल सकती है: stackoverflow.com/questions/8303803/…
मार्टिन लीवरेज

27
क्या इस उदाहरण के कारण MockXViewModel का एक उदाहरण आपके बिल्ड में एक रिलीज़ बिल्ड के लिए लोड नहीं होगा? क्या यह चिंता का विषय नहीं है?
जिपरसन

12
FYI करें: आपको निम्नलिखित की भी आवश्यकता है, या VS2012 संकलक xaml फ़ाइल संकलित नहीं करेगा: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"औरmc:Ignorable="d"
ओरियन एडवर्ड्स

51
जिपरसन सही है। मैं उपयोग करना पसंद करता हूं <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...। इस तरह, नकली दृश्यमोडल केवल डिजाइनर में ही बनाया जाएगा, न कि आपके एप्लिकेशन को चलाने के दौरान। ध्यान रखें, इस दृष्टिकोण के लिए आवश्यक है कि आपके मॉक व्यू मॉडल में एक पैरामीटर रहित निर्माता हो। लेकिन उत्तर में ऊपर दिए गए उदाहरण में भी ऐसा ही है।
Ren

2
@ अपने दृष्टिकोण को बेहतर बनाएं। कृपया इसे उत्तर के रूप में जोड़ें और मैं इसके लिए मतदान करूंगा
करूंगा

15

गोरान के स्वीकृत जवाब और रेने की उत्कृष्ट टिप्पणी के एक समामेलन के रूप में।

  • नाम स्थान घोषणा जोड़ें। xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • कोड से अपने डिजाइन समय डेटा संदर्भ को देखें।
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...


1
मैं इसे नए उत्तर के रूप में चिह्नित करने के लिए लुभा रहा हूं, लेकिन शायद हम बाकी विवरणों में खींच सकते हैं।
el2iot2

इसे अधिक दृश्यता की आवश्यकता है, या इसे स्वीकृत उत्तर में खींचने की आवश्यकता है। यह एक बेहतर उपाय है।
लॉराडकी

यह बेहतर क्यों है? पहले तो मैंने सोचा था कि स्वीकृत उत्तर अनावश्यक रूप से नकली मॉडल भी रनटाइम में पैदा करेगा लेकिन मैंने यह परीक्षण किया और वास्तव में ऐसा नहीं है। उपयोग न होने पर संसाधन नहीं बनते।
पॉल

@Paul यह वास्तव में वरीयता की बात है, लेकिन यह उत्तर पूरे डिजाइन समय डेटा संदर्भ को एक घोषणा में रखता है बनाम इसे दो स्थानों में रखता है। परिवर्तन आसान बनाता है
जॉन स्ट्रिटेनबर्गर

1
@JohnStritenberger इसकी केवल प्राथमिकता नहीं है, स्वीकृत उत्तर अनावश्यक रूप से सभी समय के लिए स्मृति में संसाधनों को लोड करता है, न कि केवल डिजाइनर के लिए।
उउदद्ल्र्र्र्स

4

कार्ल शिफलेट ने एक दृष्टिकोण का वर्णन किया है जो VS2008 और VS2010 के लिए समान रूप से अच्छी तरह से काम करना चाहिए:

WPF और सिल्वरलाइट प्रोजेक्ट्स में विज़ुअल स्टूडियो 2008 साइडर डिज़ाइनर में डिज़ाइन टाइम डेटा देखना

लॉरेंट बुगनियन में एक समान दृष्टिकोण है जो एक्सप्रेशन ब्लेंड पर केंद्रित है। यह VS2010 के लिए काम कर सकता है , लेकिन मैंने अभी तक इसकी पुष्टि नहीं की है।

Microsoft अभिव्यक्ति मिश्रण में डिज़ाइन मोड में डेटा का अनुकरण करना


इसे मेरे संज्ञान में लाने के लिए धन्यवाद। मुझे DesignAndRunTimeDataContext अवधारणा पसंद है।
el2iot2

1
कार्ल शिफलेट में विजुअल स्टूडियो 2010 के लिए एक अद्यतन लेख है: WPF और सिल्वरलाइट डिज़ाइनर में नमूना डेटा
टोटोरोकाट

1
लिंक सामग्री के सार को वास्तव में उत्तर में संपादित किया जाना चाहिए, खासकर क्योंकि पहले लिंक अब मृत हो गया है।
लॉराडकी

4

हो सकता है कि विज़ुअल स्टूडियो 2010 और एक्सप्रेशन ब्लेंड 4 की नई डिज़ाइन-टाइम सुविधाएँ आपके लिए एक विकल्प हों।

यह कैसे काम करता है , यह WPF एप्लिकेशन फ्रेमवर्क (WAF) के BookLibrary नमूना अनुप्रयोग में दिखाया गया है । कृपया .NET संस्करण डाउनलोड करें।


लिंक के लिए धन्यवाद। क्या कोई विशेष कोड फ़ाइल या निर्माण है जिसे मुझे दृष्टिकोण को देखने के लिए देखना चाहिए? (एक संक्षिप्त अवलोकन बहुत अच्छा होगा)
el2iot2

BookLibrary.resentation प्रोजेक्ट पर एक नज़र डालें। इस प्रोजेक्ट में आपको "DesignData" फ़ोल्डर मिलता है, जिसका उपयोग "व्यू" फ़ोल्डर में UserControls द्वारा किया जाता है।
जबे

1
+1। बस इस पर एक नजर थी। के लिए किसी को भी घ के माध्यम से रुचि नमूना डेटा दृश्य मॉडल XAML में घोषित कर दिया और संदर्भित है: DataContext = "{घ: DesignData स्रोत = .. / DesignData / SampleLendToViewModel.xaml}"
RichardOD

4

मैं इस दृष्टिकोण का उपयोग .NET 4.5 और विज़ुअल स्टूडियो 2013 के साथ डिज़ाइन समय डेटा बनाने के लिए करता हूं।

मेरे पास सिर्फ एक ViewModel है। व्यू मॉडल में एक संपत्ति IsInDesignModeहोती है जो बताती है कि डिज़ाइन मोड सक्रिय है या नहीं (देखें वर्ग ViewModelBase)। फिर आप अपने डिज़ाइन समय डेटा (जैसे आइटम नियंत्रण भरना) को व्यू मॉडल कंस्ट्रक्टर में सेट कर सकते हैं।

इसके अलावा, मैं वास्तविक डेटा को व्यू मॉडल के कंस्ट्रक्टर में लोड नहीं करूंगा, इससे रनटाइम में समस्या हो सकती है, लेकिन डिज़ाइन समय के लिए डेटा सेट करना कोई समस्या नहीं होनी चाहिए।

public abstract class ViewModelBase
{
    public bool IsInDesignMode
    {
        get
        {
            return DesignerProperties.GetIsInDesignMode(new DependencyObject());
        }
    }
}

public class ExampleViewModel : ViewModelBase
{
    public ExampleViewModel()
    {
        if (IsInDesignMode == true)
        {
            LoadDesignTimeData();
        }
    }

    private void LoadDesignTimeData()
    {
        // Load design time data here
    }       
}

4

विजुअल स्टूडियो 2017 का उपयोग करते हुए मैं इस तरह के सभी गाइड और प्रश्नों का पालन करने की कोशिश कर रहा हूं और मुझे अभी भी सामना करना पड़ रहा था, <ItemsControl>जो कि मुझे DesignFooViewModelविरासत में दिए गए कंस्ट्रक्टर के अंदर कोड को निष्पादित नहीं करता था FooViewModel। मैंने पुष्टि की कि इस "आसान" MSDN गाइड (स्पॉइलर) के बाद "निष्पादित नहीं किया गया" भाग :MessageBox डीबगिंग) के । हालांकि यह सीधे मूल प्रश्न से संबंधित नहीं है, मुझे आशा है कि यह दूसरों को बहुत समय बचाएगा।

पता चला कि मैं कुछ भी गलत नहीं कर रहा था। मुद्दा यह था कि मेरे आवेदन को x64 के लिए बनाया जाना चाहिए। जैसा कि विजुअल स्टूडियो 2018 में अभी भी 32-बिट प्रक्रिया है और स्पष्ट रूप से डिज़ाइनर भाग के लिए 64-बिट होस्ट प्रक्रिया को स्पिन नहीं कर सकता है यह मेरे x64 वर्गों का उपयोग नहीं कर सकता है। वास्तव में बुरी बात यह है कि मुझे लगता है कि किसी भी लॉग में पाए जाने के लिए कोई त्रुटि नहीं है।

तो अगर आप इस सवाल पर आते हैं, तो है क्योंकि आप अपने डिजाइन समय दृश्य मॉडल के साथ में फर्जी डेटा देख रहे हैं (उदाहरण के लिए: <TextBlock Text="{Binding Name}"/>शो Nameनहीं आप के लिए गुण सेट कोई फर्क) कारण अपने 64 का निर्माण होने की संभावना है। यदि आप निर्भरता के कारण अपने बिल्ड कॉन्फ़िगरेशन को किसी भी प्रकार से बदलने में असमर्थ हैं या x86, तो एक नया प्रोजेक्ट बनाने पर विचार करें जो पूरी तरह से anycpu हो और जिसमें निर्भरताएँ (या कोई निर्भरता) न हों। इसलिए आप अपने "WPF App" प्रोजेक्ट से दूर कोड के इनिशियलाइज़ेशन भागों को "C # क्लास लाइब्रेरी" प्रोजेक्ट में विभाजित करते हैं।

कोडबेस के लिए मैं काम कर रहा हूं मुझे लगता है कि यह कुछ कोड दोहराव की कीमत पर चिंताओं को स्वस्थ रूप से अलग करने के लिए मजबूर करेगा जो शायद शुद्ध सकारात्मक चीज है।


3

शीर्ष रेटेड उत्तर के समान, लेकिन मेरी राय में बेहतर है: आप डिजाइन डेटा का एक उदाहरण लौटाने के लिए एक स्थैतिक संपत्ति बना सकते हैं और इसे सीधे XAML से संदर्भित कर सकते हैं:

<d:UserControl.DataContext>
    <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" />
</d:UserControl.DataContext>

यह उपयोग करने की आवश्यकता से बचा जाता है UserControl.Resources। आपकी स्थैतिक संपत्ति एक कारखाने के रूप में कार्य कर सकती है जो आपको गैर-तुच्छ डेटा प्रकारों का निर्माण करने की अनुमति देती है - उदाहरण के लिए यदि आपके पास एक डिफ़ॉल्ट ctor नहीं है, तो आप उचित निर्भरता में इंजेक्ट करने के लिए यहाँ एक कारखाने या कंटेनर को कॉल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.