एक विंडो पर डेटा समय सेटिंग सेट करना एक कंपाइलर त्रुटि दे रहा है?


203

मेरे WPF आवेदन में मुख्य विंडो के लिए नीचे XAML है, मैं d:DataContextनीचे दिए गए डिज़ाइन समय को निर्धारित करने की कोशिश कर रहा हूं , जिसे मैं अपने सभी विभिन्न UserControls के लिए सफलतापूर्वक कर सकता हूं, लेकिन यह मुझे यह त्रुटि देता है जब मैं इसे करने की कोशिश करता हूं खिड़की...

Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI

<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow"
    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:UI="clr-namespace:BenchmarkPlus.PMT.UI"
    xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls"
    d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"
    Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82">

    <Grid>
        <!-- Content Here -->
    </grid>

</Window>

जवाबों:


263

मुझे mc:Ignorable="d"विंडो टैग में विशेषता जोड़ने की आवश्यकता थी । अनिवार्य रूप से मैंने कुछ नया सीखा। d:नामस्थान उपसर्ग मानता है कि अभिव्यक्ति ब्लेंड / दृश्य स्टूडियो डिजाइनर वास्तव में है पर ध्यान नहीं दिया / "बाहर टिप्पणी की," असली संकलक / XAML पार्सर द्वारा!

<Window 
...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
...
/>

निम्नलिखित से लिया गया था

नाथन, एडम (2010-06-04)। WPF 4 अनलेशेड (जलाने के स्थान 1799-1811)। Sams। किंडल संस्करण।

मार्कअप संगतता

मार्कअप संगतता XML नेमस्पेस ( http://schemas.openxmlformats.org/markup-compatibility/2006 , आमतौर पर एक mcउपसर्ग के साथ प्रयोग किया जाता है ) में एक इग्जीक्यूटिव विशेषता होती है जो एक्सएएमएल प्रोसेसर को निर्देश देती है कि वे निर्दिष्ट नेमस्पेस में सभी तत्वों / विशेषताओं को अनदेखा कर सकते हैं यदि वे नहीं कर सकते हैं। उनके .NET प्रकार / सदस्यों को हल किया जाए। (नाम स्थान में एक प्रक्रिया-संबंधी विशेषता भी होती है जो अनदेखे नामस्थानों के अंदर विशिष्ट प्रकारों के लिए इग्नाइड को ओवरराइड करती है।)

अभिव्यक्ति ब्लेंड इस सुविधा का लाभ उठाने के लिए एक्सएएमएल सामग्री में डिज़ाइन-टाइम गुण जोड़ते हैं जो रनटाइम पर ध्यान नहीं दिया जा सकता है।

mc:Ignorableनाम स्थान की सीमांकित सूची दी जा सकती है, और mc: ProcessContent को तत्वों का स्थान-सीमांकित सूची दिया जा सकता है। जब XamlXmlReader में आग लगने वाली सामग्री का सामना करना पड़ता है जिसे हल नहीं किया जा सकता है, तो यह इसके लिए किसी भी नोड की रिपोर्ट नहीं करता है। यदि आग्नेय सामग्री का समाधान किया जा सकता है, तो इसे सामान्य रूप से रिपोर्ट किया जाएगा। इसलिए उपभोक्ताओं को मार्कअप संगतता को सही ढंग से संभालने के लिए कुछ विशेष करने की आवश्यकता नहीं है।


12
मैं काफी समय से इसके खिलाफ अपना सिर पीट रहा हूं। समझ में आता है, लेकिन लगता है कि एक विशाल ओवरसाइट (डिज़ाइन-टाइम डेटा ऑब्जेक्ट्स को इन सभी हैक के बिना समर्थित होना चाहिए)
बेसिक

3
यदि आप विशेषता के बजाय अपने स्वयं के नोड में आग्नेय डेटा संदर्भ चाहते हैं, तो <d: Window.DataContext />
ChéDon

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

19

वाह, क्या दर्द है! चलिए उम्मीद करते हैं कि MS x: Bind के लिए कुछ VS डिज़ाइन-टाइम सपोर्ट में है।

हम VS डिज़ाइनर का उपयोग करने में सक्षम हो सकते हैं, लेकिन बाइंडिंग के बजाय x: Bind पर आसानी से स्विच करने में सक्षम हो सकते हैं। यहाँ मैंने क्या किया है:

  • मेरे विचार में, मैंने अपना ViewModel प्राप्त करने के लिए एक संपत्ति जोड़ी। यह समझ में आता है क्योंकि x: Bind पथ पृष्ठ (यानी दृश्य ऑब्जेक्ट) के सापेक्ष हैं।

  • मेरे पेज XAML में, मैंने XAML <Page ... >के शीर्ष पर निम्नलिखित को जोड़ा :

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}"

इस तरह, पृष्ठ का वास्तविक डेटा संदर्भ पृष्ठ के कारण ही सेट होता है {x:Bind}। ऐसा इसलिए x:Bindहै क्योंकि पेज के सापेक्ष है और कोई रास्ता नहीं दिया गया है।

उसी समय, d:DataContextलाइन के कारण , VS डिज़ाइनर VS डिज़ाइनर इंटरेक्शन के उद्देश्य के लिए MyView वर्ग (उदाहरण बनाए बिना) पर प्रतिबिंबित करता है। यह वीएस को MyView से डिज़ाइन करता है, जहाँ आप व्यू-मडल प्रॉपर्टी को स्क्रॉल कर सकते हैं, इसे विस्तारित कर सकते हैं और उस आइटम को चुन सकते हैं जिसे आप बाइंड करना चाहते हैं।

जब आप वह सब करते हैं, तो VS डिज़ाइनर एक बाइंडिंग स्टेटमेंट बनाएगा, जिसका पथ दृश्य के सापेक्ष है, अर्थात ऐसा होता है कि पथ x के समान ही होता है: Bind को उम्मीद है। इसलिए, यदि आप x पर स्विच करना चाहते हैं: बाद में बाइंड करें, तो आप बस " {Binding" के साथ सभी " " को खोज और बदल सकते हैं {x:Bind

d:DataContextवीएस को यह बताने के लिए कि हमें किस वर्ग की आवश्यकता है? अच्छा सवाल है, क्योंकि आपको लगता है कि वी.एस. पता लगा सकते हैं कि अगली पंक्ति का उपयोग करके DataContext को पेज पर सेट किया जा सकता है DataContext={x:Bind}। आगे बढ़ो और इसे आज़माओ, यह काम नहीं करता है और न ही यह काम करता है यदि आप x बदलते हैं: बाइंड टू बाइंडिंग रिलेटिव टू सेल्फ।

उम्मीद है कि एमएस द्वारा यह स्थिति साफ हो जाएगी !!


3
WPF x का समर्थन नहीं करता है: बिंद; यह उत्तर ओपी के लिए काम नहीं करेगा।
बाइटल मिशेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.