mvvm - यूडब्ल्यूपी कंटेंट डेलोगोल इन्वोकेशन




modal-dialog winrt-xaml (2)

SpeechDialogService में सुझाए गए समाधान SpeechDialogService Speech Dialog का उदाहरण प्रत्यक्ष रूप से देखें SpeechDialogService बनाते हैं, Speech Dialog SpeechDialogService बनाएं

public interface ISpeechDialogService
{
    Task ShowAsync();
}

public class SpeechDialogService : ISpeechDialogService
{
    public async Task ShowAsync()
    {
        var contentDialog = new Speech();
        await contentDialog.ShowAsync();

    }
}

और इस सेवा को अपने ViewModel कन्स्ट्रक्टर में ViewModel

public class AbcViewModel
{
    readonly ISpeechDialogService _dialog;

    public AbcViewModel(ISpeechDialogService dialog)
    {
        _dialog = dialog;
    }

    public async void Dictate(object obj)
    {
        await _dialog.ShowAsync();
    }
}

मैं यूवीपी और टेम्पलेट 10 का इस्तेमाल कर रहा हूं ताकि एमवीवीएम पैटर्न का पालन करके एक GUI ऐप बन सके। आवेदन के एक भाग के रूप में मुझे मुख्य पृष्ठ पर बटन दबाकर एक सामग्री संवाद को खोलने की आवश्यकता है। तो अलग ContentDialog उस उद्देश्य के लिए स्टैंडअलोन। एक्सएमएल फ़ाइल में बनाया गया था:

<ContentDialog
    x:Class="UWP1.Views.Speech"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWP1.Views"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="Dictate"
    PrimaryButtonText="Accept"
    SecondaryButtonText="Cancel"
    PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
    SecondaryButtonClick="ContentDialog_SecondaryButtonClick"
    >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150" />
            <ColumnDefinition Width="150" />
        </Grid.ColumnDefinitions>
            <Button Margin="15" Content="Dictate" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch"/>
        <Button  Margin="15" Content="Clear Text" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Stretch"/>
        <TextBlock Grid.Row="1" Grid.ColumnSpan="2" Text="Tap 'Dictate', and speak" FontSize="12" />
            <TextBlock Margin="0 10 0 0" Grid.Row="2" Grid.ColumnSpan="2" Text="Message Dication" HorizontalAlignment="Center" FontSize="24"  />
        <ScrollViewer Grid.Row="3" Grid.ColumnSpan="2" Height="300">
            <TextBox Margin="5 5 5 10"  AcceptsReturn="True"  />
        </ScrollViewer>
    </Grid>
</ContentDialog>

बटन को दबाकर मेरे मुख्य पृष्ठ में खोलने / खोलने का सही तरीका क्या है (जैसा कि मुझे दृष्टिकोण और व्यू मॉोडल के लिए अलग तर्क रखने की आवश्यकता है)?

मैं इसे अब कैसे करूँ:

मुख्य पृष्ठ से I DictateCommand को आमंत्रित करता है, जो बदले में ContentDialog का एक उदाहरण बनाता है और इसे दिखाता है:

 <AppBarButton Grid.Column="1" Icon="Microphone" IsCompact="True" HorizontalAlignment="Right" Command="{Binding DictateCommand}"/>

        public ICommand DictateCommand { get; set; }

        public async void Dictate(object obj)
        {
            var contentDialog = new Speech();
            await contentDialog.ShowAsync();
        }

यह मेरे लिए एक MVVM पैटर्न उल्लंघन की तरह दिखता है क्या आप कृपया इसे सही तरीके से करने में मेरी सहायता कर सकते हैं?

संपादित करें:

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


आपके चार विकल्प हैं

एक सबसे पहले एक सेवा है, जैसे @ पूछो-बहुत-बहुत बताता है। वास्तव में, यह एक सुंदर समाधान है अगर आपको यह पसंद है।

पहला समाधान का लाभ यह है कि यह पुन: प्रयोज्य है। यदि आप इस यूआई का पुन: उपयोग नहीं कर रहे हैं, तो एक समर्पित सेवा अधिक हो सकती है, ईमानदार हो सकती है।

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

इस दृष्टिकोण का लाभ यह है कि, पहले दृष्टिकोण की तरह, आप दूसरे वर्ग के प्रयासों को दूर कर रहे हैं। इस मामले में, आप एक सर्विस की आवश्यकता के बिना, एक सेवा इंटरफ़ेस या उस सेवा का इंजेक्शन किसी भी तरह की आवश्यकता के बिना एक बंद समाधान क्या बना रहे हैं। यदि आप घटना के परिणाम के लिए इंतजार नहीं कर रहे हैं, तो मुझे लगता है कि यह आपके जैसे 99% मुद्दों के लिए विचार है।

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

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

चौथा यह करने का चौथा तरीका संदेश भेजने का है। मैसेजिंग एक व्यू-मॉडल एक दूसरे के साथ संवाद करने के लिए उपयोग करता है। इस मामले में आप अपने व्यू-मॉडल से संदेश भेज सकते हैं (एक संदेश के साथ जिसे हम शो डायलॉग कहते हैं) जिसे किसी दूसरे दृश्य-मॉडल में नहीं बल्कि आपके पेज में भी सुनाई दी जाती है यह ठीक काम करेगा, भी।

नीचे की ओर यह है कि आपको एक संदेश समाधान की आवश्यकता है, लेकिन आपके पास पहले से ही ऐसा हो सकता है। ऊपर की ओर यह है कि विजुअल से निपटने के लिए तर्क किसी भी समय स्थानांतरित किया जा सकता है क्योंकि मैसेजिंग किसी को सुनने के लिए मल्टीकास्ट किया गया है।

अगर मैं तुम थे, तो मैं पहले 3 नंबर पर विचार करूंगा, शायद आपके ऐप परिदृश्य की थोड़ी अधिक समझ के बिना, मुझे यकीन नहीं हो सकता। आप एक डेवलपर हैं, यद्यपि। उन सभी चार विकल्प अच्छे हैं बस यूआईईलेमेंट को अपने दृश्य-मॉडल में पारित करने का मोह न करें। यह अनावश्यक नास्तिकता है :)

शुभकामनाएँ!