दिलचस्प पोस्ट
सिद्धांत – वास्तविक एसक्यूएल को कैसे मुद्रित करें, न सिर्फ तैयार बयान? एक शेल उपनाम के लिए कमांड लाइन तर्क कैसे पास करें? रोलिंग का अर्थ (चलती औसत) समूह / आईडी के साथ dplyr OnCreate () और onStart () के बीच का अंतर? एक उपयोगकर्ता के ब्राउज़र प्रदर्शित कर सकते हैं हर फ़ॉन्ट की सूची निरंतर भाषण मान्यता एंड्रॉइड जावा परियोजनाओं में अप्रयुक्त / मृत कोड कैसे खोजें आईओएस 8 में नियंत्रक अभिविन्यास को देखने के लिए मजबूर कैसे करें? VB.NET में यादृच्छिक पूर्णांक कैसे काम करता है RegexOptions.Compiled? ओपनजीएल में "तात्कालिक मोड" का क्या अर्थ है? Sed से पहले मैच के बाद लाइन डालें अजगर प्रिंट अंत = '' जावास्क्रिप्ट चर को फ्लास्क url_ के लिए पास करें पूंजी पत्रों से पहले रिक्त स्थान जोड़ें

ViewModel को ईवेंट को पास करने का सबसे अच्छा तरीका क्या है?

यह मामला है: मेरे पास एक नियंत्रण का इवेंट है, जिसे मैं अपना व्यूमोल्ड को प्रतिक्रिया देना चाहता हूं। वर्तमान में मैं अदृश्य बटन के कमांड को निष्पादित करके ऐसा कर रहा हूं जैसे कि नीचे के उदाहरण में

View.xaml में:

<Control x:Name="SearchResultGrid" ... DataRefreshed="SearchResultRefreshed" /> <Button x:Name="SearchResultRefreshedButton" Visibility="Collapsed" Command="{Binding SearchResultRefreshedCommand}" /> 

View.xaml.cs में:

 private void SearchResultRefreshed(object sender, EventArgs e) { if (SearchResultRefreshedButton.Command != null) { SearchResultRefreshedButton.Command.Execute(SearchResultGrid.ResultRowCount); } } 

यह अच्छा काम करता है, लेकिन यह मेरे लिए हैक की तरह दिखता है मैं सोच रहा हूं कि ऐसा करने का बेहतर तरीका है? मुझे कोई उदाहरण नहीं मिल सका और यही वह है जो मैंने खुद को "आविष्कार" किया

वेब के समाधान से एकत्रित समाधान "ViewModel को ईवेंट को पास करने का सबसे अच्छा तरीका क्या है?"

एमवीवीएम का प्रयोग करना, घटनाओं को संभालने का सामान्य तरीका है कि उन्हें संलग्न गुणों में लपेटें या संलग्न घटनाओं का उपयोग करें। यहां एक सम्प्रेषित संपत्ति में PreviewKeyDown ईवेंट का उपयोग करते हुए एक उदाहरण है:

 public static DependencyProperty PreviewKeyDownProperty = DependencyProperty.RegisterAttached("PreviewKeyDown", typeof(KeyEventHandler), typeof(TextBoxProperties), new UIPropertyMetadata(null, OnPreviewKeyDownChanged)); public static KeyEventHandler GetPreviewKeyDown(DependencyObject dependencyObject) { return (KeyEventHandler)dependencyObject.GetValue(PreviewKeyDownProperty); } public static void SetPreviewKeyDown(DependencyObject dependencyObject, KeyEventHandler value) { dependencyObject.SetValue(PreviewKeyDownProperty, value); } public static void OnPreviewKeyDownChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { TextBox textBox = dependencyObject as TextBox; if (e.OldValue == null && e.NewValue != null) textBox.PreviewKeyDown += TextBox_PreviewKeyDown; else if (e.OldValue != null && e.NewValue == null) textBox.PreviewKeyDown -= TextBox_PreviewKeyDown; } private static void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { TextBox textBox = sender as TextBox; KeyEventHandler eventHandler = GetPreviewKeyDown(textBox); if (eventHandler != null) eventHandler(sender, e); } 

ध्यान दें कि वास्तविक KeyEventArgs वस्तु के बजाय ICommand का उपयोग करने के लिए यह वास्तव में आसान (और बेहतर भी) है जो वास्तव में दृश्य मॉडल में नहीं होना चाहिए। बस टाइप करें ICommand की एक अटैचड प्रॉपर्टी बनाएं और इसके बजाय इस TextBox_PreviewKeyDown हैंडलर से कॉल करें:

 private static void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { TextBox textBox = sender as TextBox; ICommand command = PreviewKeyDownCommand(textBox); if (command != null && command.CanExecute(textBox)) command.Execute(textBox); } 

किसी भी तरह से, यह इस तरह से कुछ इस्तेमाल किया जाएगा:

 <TextBox TextBoxProperties.PreviewKeyDown="SomeKeyEventHandler" /> 

या यदि आपने पसंदीदा ICommand विधि का उपयोग किया है:

 <TextBox TextBoxProperties.PreviewKeyDownCommand="{Binding SomeCommand}" /> 

निजी तौर पर मुझे कंट्रोल के आयोजन से निपटने के लिए संलग्न संपत्ति का उपयोग करने की आवश्यकता नहीं थी आपके उदाहरण में, जब 'SearchResultRefreshed' को जानना चाहते हैं और फिर छिपा हुआ नियंत्रण के माध्यम से ViewModel को सूचित करना चाहते हैं … तो पहले से ही देखे गए दृश्यमॉडेल को परिणाम क्यों नहीं मिला है?

यदि परिणाम पहली बार में देखेंमोडेल से आ रहे हैं, और बाध्यकारी का उपयोग उन्हें अपने नियंत्रण में प्रदर्शित करने के लिए किया जाता है, तो ज्ञान जो खोज परिणामों को रीफ्रेश किया गया है, आपके व्यू मॉोडल द्वारा संचालित किया जाना चाहिए – आपका दृश्य नहीं है

केवल कुछ मामलों में मुझे आईसीॉमैंड्स और डाटा बाइंडिंग से दूर तोड़ने की आवश्यकता है।

आपको इसके पर बाध्य करने के लिए अपने नियंत्रण में DataRefreshed एक निर्भरता गुण जोड़ना चाहिए

यहां एक उदाहरण है कि आप यह कैसे कर सकते हैं

 public static readonly DependencyProperty DataRefreshedProperty = DependencyProperty.Register( "DataRefreshed", typeof(bool), typeof("typeof yourcontrol here "), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnDataRefreshedChanged) ) ); public bool DataRefreshed { get { return (bool)GetValue(DataRefreshedProperty); } set { SetValue(DataRefreshedProperty, value); } } 

फिर आप अपनी संपत्ति को किसी भी अन्य WPF प्रॉपर्टी की तरह हेरफेर कर सकते हैं, उदाहरण के लिए SearchResultRefreshed जो आपके व्यूमोल्ड में परिभाषित है

 <Control x:Name="SearchResultGrid" ... DataRefreshed="{Binding SearchResultRefreshed}" /> <Button x:Name="SearchResultRefreshedButton" Visibility="Collapsed" Command="{Binding SearchResultRefreshedCommand}" /> 

अधिक dependecyproperty and attachedproperty को समझने के लिए निम्नलिखित ट्यूटोरियल पर एक नज़र डालें