2016-04-08 6 views
6

WPF एप्लिकेशन में डिज़ाइन समय पर किसी विशिष्ट नियंत्रण के DataContext को कैसे निर्धारित करें?डिज़ाइन समय पर एक WPF नियंत्रण का डेटा कॉन्टेक्स्ट निर्धारित करें

DataContext विशेष रूप से, XAML में सेट किया जा सकता है विरासत में मिला है या कोड में कहीं सेट और कभी कभी यह डिजाइन समय कौन सी क्लास बाइंडिंग की बात कर रहे पर यह पता लगाने के लिए कठिन है।

DataContext कक्षा को खोजने के लिए मैं आमतौर पर क्या करना चाहता हूं VS में बाध्यकारी नाम खोजना है। उदाहरण मैं बाध्यकारी देखें

ItemSource = {Binding Items} 

की तरह कुछ है ... मैं आदेश वर्ग के लिए प्राप्त करने के लिए खोज करेंगे पाठ "आइटम" लेकिन वी.एस. कभी कभी खोजा गया पाठ (मैं में कई परियोजनाओं है खोजने के लिए विफल रहता है उपाय)।

+1

मुझे नहीं लगता कि इसके लिए एक निश्चित उत्तर है, क्योंकि यह डिजाइन समय पर ज्ञात नहीं है। रन टाइम पर कुछ विकल्प हैं ए) एक अमान्य बाध्यकारी सेट करें और अपना आउटपुट जांचें - यह आपको त्रुटि दे सकता है कि ऑब्जेक्ट पर संपत्ति नहीं मिली है b) '', लेकिन अगर क्लाइंट नाम से संबंधित कोई डेटा टेम्पलेट संबद्ध नहीं है या सी) केवल क्लास नाम दिखाएगा, तो यह देखने के लिए कि क्लास नाम के लिए खोज करने का लंबा तरीका – Tone

उत्तर

1

ControlViewModel है। तो ViewModelView के के लिए सेट करने के कई तरीके हैं, और यदि आपको अपना ViewModel मिलता है, लेकिन में Items संपत्ति नहीं है, तो इसका मतलब है कि आपको कार्य बाध्यकारी प्राप्त करने के लिए ऐसी संपत्ति जोड़नी चाहिए।

इसके अलावा, मैं आपको Debug->Windows->Output विंडो देखने की सलाह देता हूं जहां आप बाध्यकारी जानकारी देख सकते हैं। यही है कि आप बाध्यकारी त्रुटियों को जान सकते हैं।

निष्कर्ष करने के लिए, मैं स्थापित करने ViewModelDataContext करने के तौर-तरीकों को दिखाने के लिए करना चाहते हैं:

पहले दृष्टिकोण:

DataContext सेट करने के लिए कई दृष्टिकोण हैं। ध्यान में रखते हुए:

<Window.DataContext> 
    <local:MainWindowViewModel/> 
</Window.DataContext> 

दूसरा दृष्टिकोण। आप App.xaml.cs

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
      base.OnStartup(e); 
      MainWindow app = new MainWindow(); 
      ProductViewModel context = new ProductViewModel(); 
      app.DataContext = context; 
      app.Show(); 
    } 
} 

तीसरे दृष्टिकोण के OnStartUp() विधि ओवरराइड करना चाहिए। Windows के में निर्माता:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
      InitializeComponent(); 
      DataContext=new MainWindowViewModel(); 
    } 
} 

चौथे दृष्टिकोण। आप DataContextDependencyInjection से UnityContainer या अन्य आईओसी कंटेनर द्वारा सेट कर सकते हैं। लेकिन DependencyInjection, Prism और UnityContainer अन्य प्रश्न हैं और प्रश्न के इस दायरे से निकलते हैं।बस उदाहरण के लिए:

protected override void RegisterTypes() 
{ 
    unityContainer.RegisterType<object, ItemControl>("ModuleAUpper"); 
    unityContainer.RegisterType<IViewModelItemControl, ViewModelItemControl>(); 
    unityContainer.RegisterTypeForNavigation<ItemControl>(); 
} 
+0

डीबग-> विंडोज-> आउटपुट शायद व्यावहारिक समाधान है। मुझे डेटाकॉन्टेक्स्ट सेट करने के तरीके पता हैं (यहां यह अन्य डेवलपर्स द्वारा सेट किया गया है जो मैं बस सबसे आसान तरीका समझना चाहता हूं) – Nuts

+0

@ user2143213 कोई प्रश्न पूछने के लिए स्वतंत्र महसूस करें। अगर आपको लगता है कि मेरा जवाब आपकी मदद करता है, तो आप अन्य लोगों की भविष्य की खोज को सरल बनाने के उत्तर के रूप में मेरे उत्तर को चिह्नित कर सकते हैं। कृपया, इसे पढ़ें http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

2

मैं StepUp's सूची के लिए एक दृष्टिकोण जोड़ना चाहते हैं:

डिजाइन उदाहरण:

वैसे ही जैसे आप एक रन समय डेटा संदर्भ परिभाषित कर सकते हैं, तो आप डेटा संदर्भ को विशेष रूप से डिजाइन समय के लिए जोड़ सकते हैं:

<Usercontrol x:Class="MyUserControl" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:viewModels="clr-namespace:MyProject.ViewModels" 
        d:DataContext="{d:DesignInstance viewModels:MyViewModel}" 
        d:DesignHeight="300" 
        d:DesignWidth="600" 
        mc:Ignorable="d"> 
    </UserControl> 

विजुअल स्टूडियो में आप बाइंडेबल के लिए IntelliSense का उपयोग कर सकते हैं गुण और यदि आपके व्यू मॉडल में एक जटिल या यहां तक ​​कि पैरामीटर फ्री कन्स्ट्रक्टर है, तो यह डिज़ाइनर में बनाया जाएगा और आप ट्रिगर या कन्वर्टर्स को अपना एप्लिकेशन शुरू किए बिना परीक्षण कर सकते हैं।

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