2010-11-09 8 views
8

के लिए बाध्य कर मुझे आश्चर्य है कि अगर मैं इस तरह मेरे ViewModel पर एक RelayCommand बना सकते हैं:codebehind से RelayCommand फायरिंग वीएम

public RelayCommand<IList<VectorViewModel>> MyCommand { get; set; } 

ctor:

MyCommand = new RelayCommand<IList<VectorViewModel>>(DoSomething); 

और XAML के पीछे कोड से, मैं डेटाग्रिड से चुनी गई पंक्तियां और उन्हें एक सूची में डाल दें।

if (xamDatagridVector.SelectedItems.Records.Count >= 3) 
{ 
       var list = new List<VectorViewModel>(); 
       foreach (DataRecord record in xamDatagridVector.SelectedItems.Records) 
       { 
        list.Add((VectorViewModel)record.DataItem); 
       } 
} 

इस चरण में मैं उस रिलेकॉमैंड का उपयोग करके सूची को वापस व्यूमोडेल में भेजना चाहता हूं जिसे मैंने पहले बनाया था। क्या कोड में रिलेकॉमंड बनाना संभव है और इसे ViewModel के कमांड से बांधें और इसे बंद कर दें?

क्या वैकल्पिक तरीका है? मैं निश्चित रूप से एमवीवीएम-लाइट में कमजोर-संदर्भित मैसेंजर क्लास का उपयोग कर सकता हूं, लेकिन मुझे ऐसा कुछ नहीं लगता है कि वह इसे उस कॉल के सभी ग्राहकों को भेज देगा, न केवल अंतर्निहित व्यूमोडेल (जब आप कई हैं तो मैसेंजर का उपयोग करके घातक TabControls भीतर ही देखें) के उदाहरण

मुझे आशा है कि किसी को एक विचार है मुझे जा रहा है, कई धन्यवाद रखने के लिए, Kave

उत्तर

14

बस आदेश की Execute विधि CanExecute का परिणाम की जाँच के बाद फोन:

var viewModel = (MyViewModel)DataContext; 
if (viewModel.MyCommand.CanExecute(list)) 
    viewModel.MyCommand.Execute(list); 
0

private void TextBoxTextChanged(object sender, TextChangedEventArgs e) 
    { 
     var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty); 
     binding.UpdateSource(); 

     var msg = String.Format("Migrator file selection updated to {0}", ((TextBox)sender).Text); 
     var rowControl = UiHelpers.FindVisualParent<UserControl>((DependencyObject)sender); // get the  FileNameSettingsRow UserControl 
     var form = UiHelpers.FindVisualParent<UserControl>((DependencyObject)rowControl); // get the main form it is used on 

     var viewModel = (UseCaseSettingsViewModel)form.DataContext; 

     if (viewModel.UpdateFileInCollectionCommand.CanExecute(((TextBox)sender).Text)) 
      viewModel.UpdateFileInCollectionCommand.Execute(((TextBox)sender).Text); 


     Messenger.Default.Send(new NotificationMessage(this, msg), Notifications.AppendSysMessageTextToken); 

     // Tell the UseCaseSettingsViewModel to force an update and reload 
     //Messenger.Default.Send(new NotificationMessage(this, ((TextBox)sender).Text), Notifications.FileSelectionChangedInternalToken); 
    } 

जो UserControl जिस पर अधीनस्थ UserControl मौजूद DataContext मिलेगा: nd अगर कभी कभी एक ui तत्व की DataContext एक पूरे के रूप रूप से अलग है, जैसा कि मैंने का सामना करना पड़ा, तो आप कुछ इस तरह कर सकते हैं , तो आगे बढ़ें और मजेदार चीजें करें जैसा कि पहले के उत्तरों में दर्शाया गया था। इस मामले में अधीनस्थ उपयोगकर्ता नियंत्रण पर एक टेक्स्ट बॉक्स को संपादित करने के लिए आवश्यक टेक्स्टमोडल को ओवररार्किंग व्यूमोडेल को बताने के लिए आवश्यक है।

ध्यान दें कि FindVisualParent यहां से आता है >>> https://stackoverflow.com/questions/636383/wpf-ways-to-find-controls

संबंधित मुद्दे