5

コマンドパラメーターを指定して、MvvMCross (Xamarin.iOS) のコードでコマンドをボタンにバインドするにはどうすればよいですか?

// 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) はどこで指定できますか?

4

3 に答える 3

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)
}
于 2014-04-23T13:46:46.310 に答える
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取り、後で呼び出されてコマンドメソッドに渡されます。そのクラスの一部がどのように見えるかのスニペットを次に示します。FuncCanExecute/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));
        }

MvxWrappingCommand上記の例を実装するために、Mvxのクラスを変更できます。

すべての使用:

            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..
            }));
于 2015-08-04T13:26:32.707 に答える