2011-01-04 10 views
79

सवाल यह सब कुछ कहता है।मैं DataContext प्रॉपर्टी का उपयोग कर XAML में विंडो पर व्यूमोडेल कैसे सेट करूं?

मेरे पास एक खिड़की है, और ViewModel पर पूर्ण नामस्थान का उपयोग करके डेटाकॉन्टेक्स्ट सेट करने का प्रयास किया है, लेकिन मुझे कुछ गलत करने लगते हैं।

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="BuildAssistantUI.ViewModels.MainViewModel"> 

उत्तर

90

समाधान है कि अन्य लोगों को प्रदान की (जो अच्छा है, और सही हैं) के अलावा, वहाँ XAML में ViewModel निर्दिष्ट करते हैं, अभी तक अभी भी दृश्य से विशिष्ट ViewModel अलग करने के लिए एक तरीका है। जब आप पृथक परीक्षण मामलों को लिखना चाहते हैं तो उन्हें अलग करना उपयोगी होता है।

App.xaml में:

<Application 
    x:Class="BuildAssistantUI.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:BuildAssistantUI.ViewModels" 
    StartupUri="MainWindow.xaml" 
    > 
    <Application.Resources> 
     <local:MainViewModel x:Key="MainViewModel" /> 
    </Application.Resources> 
</Application> 

MainWindow.xaml में:

<Window x:Class="BuildAssistantUI.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{StaticResource MainViewModel}" 
    /> 
+0

ओह वाह ... धन्यवाद। मैंने इसे पहले से ही उत्तर के रूप में चिह्नित किया है, लेकिन आपके अतिरिक्त की सराहना की गई है। इसका इस्तेमाल करेंगे। – Nicholas

+0

@ निकोलस: दूसरा उत्तर प्रश्न के लिए बिल्कुल सही है, इसलिए मैं आपके निर्णय –

+0

से फिर से सहमत हूं ... आपका पूरा हो गया है। अगर कोई और इस पोस्ट पर जाता है ... – Nicholas

114

इसके बजाए इसे आजमाएं।

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels"> 
    <Window.DataContext> 
     <VM:MainViewModel /> 
    </Window.DataContext> 
</Window> 
+3

मुझे यह विकल्प सबसे अच्छा लगता है। अगर क्लीनर केवल मेनविंडो के लिए उपयोग किया जाता है तो क्लीनर लगता है। –

+10

'विंडो' तत्व पर एक विशेषता का उपयोग कर डेटा संदर्भ सेट करने का कोई तरीका है, जैसे 'DataContext = "VM: MainWindowViewModel" '? – Oliver

+0

यह सही तरीका है! – JavierIEH

7

आपको मेनव्यूमोडेल को तुरंत चालू करने और इसे डेटाकॉन्टेक्स्ट के रूप में सेट करने की आवश्यकता है। आपके बयान में यह सिर्फ स्ट्रिंग मान के रूप में विचार करें।

 <Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"> 
     <Window.DataContext> 
     <local:MainViewModel/> 
     </Window.DataContext> 
+0

धन्यवाद, मुझे लगा कि यह ऐसा कर रहा था। – Nicholas

3

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

उदाहरण के लिए this article देखें।

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