WPF MVVM सीधे XAML विंडो दृश्यों के बजाय ContentControl + DataTemplate Views का उपयोग क्यों करें?


83

यही कारण है?

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>

अपने ExampleView.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: (एक विंडो जो संसाधनविहीन नहीं है)

<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>

अनिवार्य रूप से यह "डेटाटेम्पलेट के रूप में देखें" (वीडी) बनाम "विंडो के रूप में देखें" (VaW)

यहाँ मेरी तुलना की समझ है:

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

तो यहां क्या हो रहा है? क्या मैं अभी XAML में अपनी खिड़कियां नहीं बना सकता, वीएम के गुणों के माध्यम से उनके डेटा को सफाई से एक्सेस कर सकता हूं और इसके साथ किया जा सकता है? कोड-पीछे एक ही (लगभग शून्य) है।

मैं यह समझने के लिए संघर्ष कर रहा हूं कि क्यों मुझे एक संसाधन केंद्र में सभी दृश्य सामग्री को फेरबदल करना चाहिए।


2
इस तरह से सोचें: ViewModels को Windows या UserControls में प्रदर्शित किया जाएगा। पोटो को डेटाटेम्पलेट में प्रदर्शित किया जाएगा। :)
देव हेजहोग

जवाबों:


130

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

<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का एक उदाहरण है VM2, तब View2प्रदर्शित किया जाएगा।

दी गई, इसका कोई मतलब नहीं है अगर केवल 1 दृश्य अपेक्षित है, और कभी नहीं बदला गया।


8

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


5

मेरे व्यक्तिगत अनुभव से: दोनों काम मॉडल एविएबल्स हैं, जो आप चाहते हैं, और आवेदन आवश्यकताओं के आधार पर। 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। यह पिछले एक ऐप में आंतरिक आइटम के लिए इस्तेमाल किया जा सकता है, कि खिड़कियों की आवश्यकता नहीं है। आप आवेदन की आवश्यकताओं और एप्लिकेशन को विकसित करने के लिए उपयुक्त समय के आधार पर आपके लिए बेहतर है। आशा है कि यह व्यक्तिगत अनुभव मदद करता है ...

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