दिलचस्प पोस्ट
मैं एंड्रॉइड के सिस्टम संस्करण को कैसे देख सकता हूं? प्रारंभिक सूची दृश्य स्टूडियो 2012 में वेक्टर के साथ काम नहीं कर रही है? एक भाषा कब स्क्रीटिंग भाषा माना जाता है? सरणी में लंबाई के सभी सबसेट खोजें एक अभी-अभी-समय (जेआईटी) कंपाइलर क्या करता है? क्यों पूर्णांक संख्या = Integer.getInteger ("123") NullPointerException फेंकें? मणि स्थापित करने में असमर्थ – मणि देशी एक्सटेंशन बनाने में विफल – ऐसी फ़ाइल लोड नहीं कर सकता – mkmf (LoadError) जेपीए और सीतनिद्रा में होना का उपयोग कर आलियाई प्रारंभिकरण को हल करने के लिए कैसे करें कुछ घंटों तक से तिथि लेना AJAX अनुरोध के माध्यम से उपयोगकर्ता इनपुट के आधार पर रेड्र Google चार्ट इटरेटिव पेड़ चलना NHibernate गतिशील कॉलम संख्या इनलाइन तत्वों और रेखा-ऊंचाई बड़ी रस्सियों के साथ जुड़ें एंड्रॉइड बाजार पर अपलोड किए गए ऐप के लिए मेरी मुख्य स्टोस्ट खो दी

WPF एमवीवीएम क्यों सीधे सीएएमएएमएल खिड़की के दृश्य से सामग्री कंट्रोल + डेटाटाइमलेट दृश्य का उपयोग करते हैं?

मुझे WPF में एमवीवीएम के बारे में एक सवाल है जो मुझे बैटेटिंग कर रहा है

ऐसा कुछ क्यों करते हैं?

MainWindow.xaml:

<Window x:Class="MVVMProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <ContentControl Content="{Binding}"/> </Grid> </Window> 

अपने उदाहरण View.xaml को इस रूप में स्थापित करें:

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vms="clr-namespace:MVVMProject.ViewModels"> <DataTemplate DataType="{x:Type vms:ExampleVM}" > <Grid> <ActualContent/> </Grid> </DataTemplate> </ResourceDictionary> 

और इस तरह खिड़की बनाओ:

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

जब आप ऐसा कर सकते हैं 😕

App.xaml: (स्टार्टअप विंडो सेट करें / देखें)

 <Application x:Class="MVVMProject.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="ExampleView.xaml"> </Application> 

ExampleView.xaml: (एक खिड़की एक ResourceDictionary नहीं है)

 <Window x:Class="MVVMProject.ExampleView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vms="clr-namespace:MVVMProject.ViewModels"> > <Window.DataContext> <vms:ExampleVM /> </Window.DataContext> <Grid> <ActualContent/> </Grid> </Window> 

मूलतः यह "डेटाटाइमेट के रूप में देखें" (वीएडी) बनाम "विंडो के रूप में देखें" (वीएडब्ल्यू)

यहां तुलना की मेरी समझ है: (ध्यान दें कि मैं वीएस 2008 का उपयोग करता हूं, इसलिए मुझे ब्लेंडेबिलिटी और / या अन्य सामान की कमी है)

  • वीएडी: विंडो बंद किए बिना दृश्य स्विच करने देता है। (यह मेरी परियोजना के लिए वांछनीय नहीं है)
  • वीएडी: वी एम वी के बारे में बिल्कुल कुछ भी नहीं जानता, जबकि वीएडब्ल्यू में इसे (केवल) को दूसरी खिड़की खोलते समय इन्स्तांत करने में सक्षम होना चाहिए
  • वीएडब्लू: मैं वास्तव में डिजाइनर में अपने जीएएमएल को देख सकता हूं (मैं कम से कम मेरे वर्तमान सेटअप में वीएडी के साथ नहीं कर सकता)
  • वाहा: खोलने और बंद होने वाली खिड़कियों के साथ सहज रूप से कार्य करता है; प्रत्येक विंडो में एक संबंधित दृश्य (और देखेंमोडेल) है
  • वीएडी: व्यू मॉडेल प्रॉपर्टी के माध्यम से प्रारंभिक विंडो चौड़ाई, ऊंचाई, रिज़ेबिलिटी इत्यादि के साथ पास कर सकती है (जबकि वीएडब्ल्यू में वे सीधे विंडो में सेट होते हैं)
  • वीएडब्ल्यू: फोकस मैनेजर। फोकस एलेमेंट सेट किया जा सकता है (सुनिश्चित नहीं है कि वीएडी में कैसे)
  • वीएडब्लूः कम विंडो, क्योंकि मेरी विंडो प्रकार (जैसे रिबन, डायलॉग) उनके दृश्यों में शामिल हैं

तो यहाँ क्या हो रहा है? क्या मैं सिर्फ एक्सएएमएल में अपनी खिड़कियों का निर्माण नहीं कर सकता, वीएम के गुणों के माध्यम से अपने डेटा को साफ रूप से एक्सेस कर सकता हूं, और इसके साथ किया जा सकता है? कोड-पीछे एक ही है (लगभग शून्य)। मैं यह समझने के लिए संघर्ष कर रहा हूं कि मुझे सभी दृश्य स्टफ को एक रिसोर्सडियोजन में क्यों फेर लेना चाहिए? (लेकिन मैं इसे गलत नहीं करना चाहता ;-))


क्या यह भी बात करता है? क्या मुझे कुछ याद आ गया है? पढ़ने के लिए बहुत बहुत धन्यवाद : हे


एमवीवीएम की खुशियां समझने के लिए राहेल लीम और निक पॉलीक के लिए धन्यवाद

संपादित करें: छोटा प्रवाह परिवर्तन

Solutions Collecting From Web of "WPF एमवीवीएम क्यों सीधे सीएएमएएमएल खिड़की के दृश्य से सामग्री कंट्रोल + डेटाटाइमलेट दृश्य का उपयोग करते हैं?"

लोग उस DataTemplates उपयोग करते हैं, जब वे देखेंमोडेल के आधार पर दृश्य गतिशील रूप से स्विच करना चाहते हैं:

 <Window> <Window.Resources> <DataTemplate DataType="{x:Type local:VM1}"> <!-- View 1 Here --> </DataTemplate> <DataTemplate DataType="{x:Type local:VM2}"> <!-- View 2 here --> </DataTemplate> </Window.Resources> <ContentPresenter Content="{Binding}"/> </Window> 

इसलिए,

अगर Window.DataContext VM1 का एक उदाहरण है, तो View1 प्रदर्शित किया जाएगा,

और अगर

Window.DataContext का एक उदाहरण है, फिर View2 प्रदर्शित किया जाएगा।

दी, यह केवल 1 दृश्य की उम्मीद है, और कभी नहीं बदले, सभी में कोई मतलब नहीं है।

मुझे उम्मीद है कि यह काफी स्पष्ट है: पी

वीएडी में देखने के मॉडल विचारों के बारे में कुछ भी नहीं जानते हैं, इसलिए आप केवल पूरी तरह से दृश्य मॉडल के बने होते हैं और कोई भी दृश्य नहीं बना सकते हैं। यह एक ऐसा अनुप्रयोग लिखने की संभावना की ओर जाता है जो कोड द्वारा पूरी तरह से संचालित हो सकता है। इससे जीयूआई के बिना एकीकरण परीक्षण करने की संभावना बढ़ जाती है। जीयूआई के माध्यम से एकीकरण परीक्षण बेहद नाजुक है – जबकि दृश्य मॉडल के माध्यम से परीक्षण अधिक मजबूत होना चाहिए।

मेरे व्यक्तिगत अनुभव से: दोनों काम मॉडल aviables हैं, क्या आप चाहते हैं के आधार पर, और आवेदन की आवश्यकताओं के आधार पर। VaD पीछे का विचार सामग्री, और कंटेनर को नष्ट करना है। यदि आप VaD लागू VaD तो आप इस टेम्पलेट (डिफ़ॉल्ट रूप से) का उपयोग कर सकते हैं, जब भी आप इस प्रकार के किसी भी आइटम को दिखाएंगे। आप इसे ItemsControls (सूचियों, सूचीदृश्य, ग्रिड आदि) में और ContentControls केवल बाइंडिंग कर सकते हैं। जैसे आपने कहा था, VaD खिड़की की सामग्री को बंद करने और एक नया खोलने के साथ काम करने के लिए काम करती है इसके अलावा आप UserControls कंट्रोल के जरिए दृश्य को परिभाषित कर सकते हैं, फिर आप केंद्रित तत्वों पर नियंत्रण कर सकते हैं, और आप पीछे कोड का प्रबंधन भी कर सकते हैं। इसलिए, आपका डेटा टेम्प्लेट इस तरह से हो सकता है:

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vms="clr-namespace:MVVMProject.ViewModels"> <DataTemplate DataType="{x:Type vms:ExampleVM}" > <CustomUserControl A="{Binding A}" B="{Binding B}" DataContext="{Binding}" .../> </DataTemplate> 

आप भी एक UserControl में निर्भरता गुण सेट कर सकते हैं, जो काम को आसान बनाते हैं, क्योंकि ऐप को बाइंडिंग और डिकॉप्लिंग की अनुमति है।

लेकिन जाहिर है, यदि आप को गतिशील रूप से सामग्री स्विचिंग की आवश्यकता नहीं है, तो मुख्य विंडो या किसी अन्य विंडो के लिए VaW का उपयोग करना ठीक है। वास्तव में, आप VaW और VaD दोनों का उपयोग कर सकते हैं। यह पिछले एक ऐप में आंतरिक आइटम के लिए इस्तेमाल किया जा सकता है, जिसके लिए विंडो की आवश्यकता नहीं होती है ऐप के विकास के लिए आवेदन की आवश्यकताओं के आधार पर और आपके लिए समय-समय पर आपके लिए क्या बेहतर है, आप शूज़ करते हैं। आशा है कि यह व्यक्तिगत अनुभव मदद करता है …