2013-07-05 6 views
5

मैं कमांड पैरामीटर निर्दिष्ट करने के साथ MvvMCross (Xamarin.iOS) में कोड में एक बटन को कमांड कैसे जोड़ सकता हूं?पैरामीटर के साथ MvvMCross बाइंड कमांड (सी # कोड में)

// command definition 
public MvxCommand SaveDealerDataCommand 
{ 
    get { return new MvxCommand<bool>(DoSaveDealerDataAction); } 
} 

public void DoSaveDealerDataAction(bool show) 
{ 
    //... 
} 

// binding 
bindingset.Bind(saveButton).To(vm => vm.SaveDealerDataCommand); 

मैं पैरामीटर (सत्य/झूठा) कहां निर्दिष्ट कर सकता हूं जो कमांड को पास किया जाएगा?

उत्तर

8

एंड्रॉइड और आईओएस बटनों में CommandParameter गुण नहीं हैं जो विंडोज़ करते हैं।

हालांकि, MvvmCross हाल ही में मूल्य कन्वर्टर्स के माध्यम से CommandParameter बाइंडिंग लागू करने के लिए एक तरह से परिचय था - देखना http://slodge.blogspot.co.uk/2013/06/commandparameter-binding.html

यह बाध्यकारी रूप में काम करना चाहिए:

bindingset 
    .Bind(saveButton) 
    .To(vm => vm.SaveDealerDataCommand) 
    .WithConversion("CommandParameter", true);  

या:

bindingset 
    .Bind(saveButton) 
    .To(vm => vm.SaveDealerDataCommand) 
    .WithConversion(new MvxCommandParameterValueConverter(), true);  

ध्यान दें कि यह CommandParameter बाइंडिंग 3.0.8.1 पैकेज में पूरी तरह से नहीं है जो स्थिर न्यूजेट रिलीज है, इसलिए यह काम करने के लिए y कहां तो करना पड़ सकता है:

  1. अपने Setup.cs

    protected override void FillValueConverters(IMvxValueConverterRegistry registry) 
    { 
        base.FillValueConverters(registry); 
        registry.AddOrOverwrite(
         "CommandParameter", 
         new Cirrious.MvvmCross.Binding.MvxCommandParameterValueConverter() 
        ); 
    } 
    
  2. या बीटा nuget 3.0.8.1 के बाद से अपलोड संकुल में से एक प्रयोग में इस मैनुअल मूल्य कनवर्टर पंजीकरण जोड़ें (सेट nuget इन पैकेजों को देखने के लिए prereleases शामिल करने के लिए)।

  3. या निर्माण स्रोत खुद

+2

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

1

अपने UITextField नियंत्रणों में से एक में पाठ का उपयोग कर अपने गतिशील आदेश पैरामीटर प्राप्त करने के लिए, आप एक स्ट्रिंग संपत्ति के लिए कि UITextField में पाठ आप पर बाध्य कर सकता है ViewModel और आपके बटन के बाध्य कमांड में चलने वाला कोड निष्पादित होने पर उस प्रॉपर्टी के माध्यम से मूल्य तक पहुंचने में सक्षम होगा।

अपने ViewController में, कुछ की तरह:

UITextField textField = new UTextField(); 
textField.Frame = new RectangleF(0,0,120,30); 
Add(textField); 
UIButton button = new UIButton(); 
button.Frame = new RectangleF(70,40,50,30); 
button.SetTitle("Click Me"); 
Add(button); 

var bindingSet = this.CreateBindingSet<MyView, MyViewModel>(); 
bindingSet.Bind(textField).To(vm => vm.StringProperty); 
bindingSet.Bind(button).To(vm => vm.ClickCommand); 
bindingSet.Apply(); 

फिर, अपने ViewModel में:

private string _stringProperty = string.Empty; 
public string StringProperty 
{ 
    get { return _stringProperty; } 
    set 
    { 
     _stringProperty = value; 
     RaisePropertyChanged(() => StringProperty); 
    } 
} 
public ICommand ClickCommand 
{ 
    get 
    { 
     return new MvxCommand(HandleClick); 
    } 
} 

public void HandleClick() 
{ 
    //Code that accesses StringProperty (which contains the UITextField's value) 
} 
+0

हाय, क्षमा करें, लेकिन यह मेरी समस्या (* 1 साल पहले * से फिट नहीं है)। प्रश्न कमांड पैरामीटर लक्षित। –

+0

क्षमा करें, मैं आपके मूल पद के नीचे टिप्पणी में माइकल द्वारा उठाए गए प्रश्न का उत्तर देने का प्रयास कर रहा था। – jyarnott

0

एक गतिशील आदेश मापदंडों आदेश को देखने के मॉडल में पास करने के लिए आप एक नया वर्ग बना सकते हैं जैसे इस DynamicCommandParameterValueConverter की तरह:

/// <summary> 
    /// This class is inspired by MvvmCross MvxCommandParameterValueConverter, 
    /// but because we need dynamic command parameters, we need to implement our own combined with a CustomMvxWrappingCommand. 
    /// </summary> 
    /// <typeparam name="T">The type of the 'selected item' for the command</typeparam> 
    /// <typeparam name="TResult">The returned result that is used as input for the command.</typeparam> 
    public class DynamicCommandParameterValueConverter<T, TResult> : MvxValueConverter<ICommand, ICommand> 
    { 
     private readonly Func<T, TResult> commandParameterExpression; 

     public DynamicCommandParameterValueConverter(Func<T, TResult> commandParameterExpression) 
     { 
      this.commandParameterExpression = commandParameterExpression; 
     } 

     protected override ICommand Convert(ICommand value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return new CustomMvxWrappingCommand<T, TResult>(value, commandParameterExpression); 
     } 
    } 

CustomMvxWrappingCommand एक Func तर्क के रूप में लेता है, और बाद में लागू किया और आदेश CanExecute/Execute विधि में पारित कर दिया गया है।

public void Execute(object parameter) 
     { 
      if (wrapped == null) 
      { 
       return; 
      } 

      if (parameter != null) 
      { 
       Mvx.Warning("Non-null parameter overridden in MvxWrappingCommand"); 
      } 

      wrapped.Execute(commandParameterOverride((T)parameter)); 
     } 

ऊपर दिए गए उदाहरण को लागू करने के Mvx से MvxWrappingCommand वर्ग को संशोधित कर सकता है: यहां बताया गया है कि वर्ग का हिस्सा दिखाई दे सकता है का एक टुकड़ा है।

यह सब का उपयोग करते हैं:

  set.Bind(myControl).For(control => control.ItemClick).To(vm => vm.MyCommand).WithConversion(
      new DynamicCommandParameterValueConverter<MyModel, string>((MyModel item) => 
      { 
       // Do custom logic before parsing the item.. 
      })); 
संबंधित मुद्दे