दिलचस्प पोस्ट
बुलबुला सॉर्ट होमवर्क करें रद्द करके अलार्म मैनेजर से अलार्म हटाएं () – एंड्रॉइड देखो और महसूस स्विंग जेटबबेदपैन में अपडेट नहीं कर रहा है जावा डिफ़ॉल्ट कन्स्ट्रक्टर यूआईएलबल में कस्टम स्थापित फ़ॉन्ट ठीक से प्रदर्शित नहीं है जब तक फ़ाइल पूरी तरह से लिखित नहीं हो जाती तब तक प्रतीक्षा करें ऑर्डर से खंड के बिना एक एसक्यूएल चयन बयान का आदेश अंडरलाइन रंग बदलना कैसे जावास्क्रिप्ट का उपयोग कर html बटन को अक्षम करें? कैसे सादे कार्य (नहीं कार्य <टी>) पर Async.AwaitTask को? SQL अद्यतन top1 पंक्ति क्वेरी कैसे PHP में websockets सर्वर बनाने के लिए अस्थायी COM ऑब्जेक्ट जारी करना Runtime.getRuntime () के साथ पुनर्निर्देशन। Exec () काम नहीं करता है क्या JVM एक कंपाइलर या एक दुभाषिया है?

MVVM WPF में नई विंडो खोलना

मेरे पास बटन है और मैंने ViewModel में कमांड करने के लिए इस बटन को बाँध लिया है, ओपनविंडो कॉमांड जब मैं बटन पर क्लिक करता हूं तो मैं नई विंडो खोलना चाहता हूं। लेकिन विंडो मॉडल बनाना और दृश्य मॉडल से विंडो दिखाते हुए एमवीवीएम का उल्लंघन है। मैंने इंटरफ़ेस की तरह बनाया है

interface IWindowService { void showWindow(object dataContext); } 

और WindowService इस इंटरफ़ेस को इस तरह लागू करता है

 class WindowService:IWindowService { public void showWindow(object dataContext) { ChildWindow window=new ChildWindow(); window.DataContext=dataContext; window.Show(); } } 

इस वर्ग में मैंने बालविंडो को निर्दिष्ट किया है। तो इस वर्ग को बालविंडो दिखाकर कसकर युग्मित किया गया है। जब मैं एक और खिड़की दिखाना चाहता हूं, तो मुझे एक ही इंटरफेस और तर्क के साथ एक और वर्ग को लागू करना होगा। मैं इस वर्ग को जेनेरिक बना सकता हूं ताकि मैं किसी भी खिड़की का उदाहरण आवंटित कर सकूं और वर्ग किसी भी विंडो को खोलने में सक्षम हो जाएगा? मैं किसी भी निर्मित एमवीवीएम फ्रेमवर्क का उपयोग नहीं कर रहा हूं। मैंने स्टैक ओवरफ्लो पर कई लेख पढ़े हैं लेकिन मुझे इसके लिए कोई समाधान नहीं मिला।

Solutions Collecting From Web of "MVVM WPF में नई विंडो खोलना"

आप कहते हैं "खिड़की का निर्माण करना और दृश्य मॉडल से खिड़की दिखाना एमवीवीएम का उल्लंघन है"। यह सही है।

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

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

इस कदर:

 class WindowService:IWindowService { public void ShowWindow(object viewModel) { var win = new Window(); win.Content = viewModel; win.Show(); } } 

जाहिर है आप को यह सुनिश्चित करने की ज़रूरत है कि आपके पास वीएम-> एप। एक्सएमएल में सेट किए गए अन्तर्निहित टेम्पलेट्स को काम करने के लिए देखें। यह सिर्फ मानक वीएम पहले एमवीवीएम है।

उदाहरण के लिए:

 <Application x:Class="My.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:My.App.ViewModels" xmlns:vw="clr-namespace:My.App.Views" StartupUri="MainWindow.xaml"> <Application.Resources> <DataTemplate DataType="{x:Type vm:MyVM}"> <vw:MyView/> </DataTemplate> </Application.Resources> </Application> 

एक संभावना यह है कि:

 class WindowService:IWindowService { public void showWindow<T>(object DataContext) where T: Window, new() { ChildWindow window=new T(); window.Datacontext=DataContext; window.show(); } } 

तो आप बस कुछ तरह जा सकते हैं:

 windowService.showWindow<Window3>(windowThreeDataContext); 

नई बाधा के बारे में अधिक जानकारी के लिए, http://msdn.microsoft.com/en-gb/library/sd2w2ew5.aspx देखें

नोट: new() constraint केवल तब ही काम करता है जहां खिड़की में पैरासेलेबल कन्स्ट्रक्टर होगा (लेकिन मैं सोचता हूं कि इस मामले में कोई समस्या नहीं होनी चाहिए!) अधिक सामान्य स्थिति में, सामान्य प्रकार का उदाहरण देखें ? संभावनाओं के लिए

अपनी विंडो में एक सामग्री प्रदाता का उपयोग करें जहां आप अपने डेटाकोनक्स्ट को बाइंड कर सकते हैं। और फिर अपने डेटाकॉन्टेक्स्ट के लिए एक Datatemplate परिभाषित करें ताकि wpf आपके DataContext को रेंडर कर सके। मेरी डायलॉग विंडोज सर्विस जैसी कोई चीज़

इसलिए आपको केवल एक ContentPresenter के साथ एक ChildWindow की आवश्यकता है:

 <Window x:Class="ChildWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" WindowStartupLocation="CenterOwner" SizeToContent="WidthAndHeight"> <ContentPresenter Content="{Binding .}"> </ContentPresenter> </Window> 

आप इस तरह एक फ़ंक्शन लिख सकते हैं:

 class ViewManager { void ShowView<T>(ViewModelBase viewModel) where T : ViewBase, new() { T view = new T(); view.DataContext = viewModel; view.Show(); // or something similar } } abstract class ViewModelBase { public void ShowView(string viewName, object viewModel) { MessageBus.Post( new Message { Action = "ShowView", ViewName = viewName, ViewModel = viewModel }); } } 

सुनिश्चित करें कि ViewBase में एक DataContext संपत्ति है (आप उपयोगकर्ता नियंत्रण संचालित कर सकते हैं)

सामान्य तौर पर मैं किसी प्रकार का संदेश बस बनाऊंगा और दृश्य मैनेजर को एक दृश्य के लिए पूछे जाने वाले संदेशों के लिए सुनना होगा। ViewModels दिखाए जाने वाले दृश्य और डेटा दिखाने के लिए एक संदेश भेजेगा। व्यू मैनेजर इसके बाद के कोड का उपयोग करेगा।

ViewModel को देखें प्रकार के बारे में जानने के लिए कॉलिंग को रोकने के लिए, आप ViewManager को देखने के स्ट्रिंग / तार्किक नाम दे सकते हैं और ViewManager को एक प्रकार में तार्किक नाम का अनुवाद कर सकते हैं।

शायद आप खिड़की के प्रकार को पार कर सकते हैं

Activator.CreateInstance() का उपयोग करने का प्रयास करें।

निम्न प्रश्न देखें: एक क्रम-निर्धारित प्रकार के साथ एक ऑब्जेक्ट इंस्टेंटिएट करें ।

चकृत द्वारा समाधान:

 // determine type here var type = typeof(MyClass); // create an object of the type var obj = (MyClass)Activator.CreateInstance(type); 

मुझे स्वीकार किए जाते हैं समाधान बहुत ही उपयोगी है, लेकिन जब यह व्यावहारिक रूप से कोशिश कर रहा है, तो मुझे पता चला कि यह यूज़रट्रॉंट (जो दृश्य जो कि वीएम -> देखें मैपिंग से परिणाम होता है) डॉक को होस्टिंग विंडो के भीतर बनाने के लिए पूरी क्षेत्र पर कब्जा करने की क्षमता का अभाव है इसके द्वारा प्रदान किया गया इसलिए मैंने इस क्षमता को शामिल करने के लिए समाधान बढ़ाया:

 public Window CreateWindowHostingViewModel(object viewModel, bool sizeToContent) { ContentControl contentUI = new ContentControl(); contentUI.Content = viewModel; DockPanel dockPanel = new DockPanel(); dockPanel.Children.Add(contentUI); Window hostWindow = new Window(); hostWindow.Content = dockPanel; if (sizeToContent) hostWindow.SizeToContent = SizeToContent.WidthAndHeight; return hostWindow; } 

यहां की चाल VM से परिवर्तित दृश्य को होस्ट करने के लिए एक DockPanel का उपयोग कर रही है।

इसके बाद आप पिछली विधि का उपयोग निम्नानुसार कर सकते हैं, यदि आप विंडो के आकार को अपनी सामग्री के आकार से मेल करना चाहते हैं:

 var win = CreateWindowHostingViewModel(true, viewModel) win.Title = "Window Title"; win.Show(); 

या यदि आपके पास विंडो के लिए एक निश्चित आकार है, तो निम्नानुसार है:

 var win = CreateWindowHostingViewModel(false, viewModel) win.Title = "Window Title"; win.Width = 500; win.Height = 300; win.Show();