2013-07-05 2 views
5

명령 매개 변수를 지정하여 MvvMCross (Xamarin.iOS) 코드의 단추에 명령을 바인딩하는 방법은 무엇입니까?매개 변수가있는 MvvMCross 바인드 명령 (C# 코드)

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

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

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

어디로 명령에 전달할 매개 변수 (true/false)를 지정할 수 있습니까?

답변

8

Android 및 iOS 버튼에는 Windows와 동일한 방식으로 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 바인딩은 stable nuget release 인 3.0.8.1 패키지에 완전히 포함되어 있지 않으므로이 작업을 수행하십시오. OU 중 하나를해야 할 수도 있습니다

  1. 이 Setup.cs

    protected override void FillValueConverters(IMvxValueConverterRegistry registry) 
    { 
        base.FillValueConverters(registry); 
        registry.AddOrOverwrite(
         "CommandParameter", 
         new Cirrious.MvvmCross.Binding.MvxCommandParameterValueConverter() 
        ); 
    } 
    
  2. 또는 3.0.8.1 이후 업로드 베타 nuget 패키지를 사용 하나이 설명서 값 변환기 등록을 추가 (설정 nuget 이러한 패키지를 볼 수있는 prereleases 포함).

  3. 또는 빌드 소스 자신이

+2

이 답변에 새로운 업데이트가 있습니까? 내 UIButton에 iOS에서 동적 명령 매개 변수를 사용하고 싶습니다. 예를 들어, 버튼을 클릭하면 내 UITextField 컨트롤 중 하나에 현재 텍스트가있는 내 명령이 호출되고 .Bind로 연결됩니다. – 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(); 

그런 다음 뷰 모델에 :

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

죄송합니다. 원본 게시물 아래의 댓글에서 Michael이 제기 한 질문에 대답하려고 시도했습니다. – 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 방법으로 전달됩니다. 당신은 위의 예를 구현하는 MVX에서 MvxWrappingCommand 클래스를 수정할 수

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)); 
     } 

: 여기에 클래스의 일부처럼 보일 수있는 방법의 조각이다.

모두의 사용 :

  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.. 
      })); 
관련 문제