2013-07-05 30 views
5

Làm cách nào để liên kết lệnh với một nút mã trong MvvMCross (Xamarin.iOS) với chỉ định tham số lệnh?Lệnh liên kết MvvMCross với tham số (trong mã 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); 

Tôi có thể chỉ định thông số (đúng/sai) sẽ được chuyển cho lệnh ở đâu?

Trả lời

8

Nút Android và iOS không có CommandParameter thuộc tính giống như cách Windows thực hiện.

Tuy nhiên, MvvmCross đã vừa giới thiệu một cách để giới thiệu CommandParameter bindings qua Giá trị chuyển đổi - xem http://slodge.blogspot.co.uk/2013/06/commandparameter-binding.html

này ràng buộc nên hoạt động như:

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

hay:

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

Lưu ý rằng này ràng buộc CommandParameter không phải là hoàn toàn trong gói 3.0.8.1 là bản phát hành nuget ổn định, do đó, để thực hiện công việc này y ou có thể cần phải hoặc là:

  1. Thêm thủ đăng ký chuyển đổi giá trị này trong Setup.cs bạn

    protected override void FillValueConverters(IMvxValueConverterRegistry registry) 
    { 
        base.FillValueConverters(registry); 
        registry.AddOrOverwrite(
         "CommandParameter", 
         new Cirrious.MvvmCross.Binding.MvxCommandParameterValueConverter() 
        ); 
    } 
    
  2. Hoặc sử dụng một trong các gói beta NuGet tải lên từ 3.0.8.1 (set NuGet để bao gồm tiền phát hành để xem các gói này).

  3. Hoặc xây dựng nguồn mình

+2

Có bất kỳ bản cập nhật mới cho câu trả lời này? Tôi muốn có một tham số lệnh động trong iOS cho UIButton của tôi. Ví dụ, khi bạn nhấp vào nút, nó sẽ gọi lệnh của tôi với Văn bản hiện tại trong một trong các điều khiển UITextField của tôi ... và tất cả được nối với .Bind. – Michael

1

Để đạt được thông số lệnh động của bạn bằng cách sử dụng văn bản trong một trong các điều khiển UITextField của bạn, bạn có thể liên kết các văn bản trong UITextField rằng để sở hữu một chuỗi trên bạn ViewModel và mã chạy trong lệnh ràng buộc của nút của bạn sẽ có thể truy cập vào giá trị thông qua thuộc tính đó khi nó thực hiện.

Trong ViewController của bạn, một cái gì đó như:

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

Sau đó, trong ViewModel của bạn:

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

Xin chào, xin lỗi, nhưng điều đó không phù hợp với vấn đề của tôi (* từ 1 năm trước *). Các tham số lệnh được nhắm mục tiêu câu hỏi. –

+0

Xin lỗi, tôi đã cố gắng trả lời câu hỏi do Michael đặt ra trong Nhận xét bên dưới bài đăng gốc của bạn. – jyarnott

0

Để vượt qua một thông số lệnh động để lệnh trong mô hình xem bạn có thể tạo một lớp mới ví dụ như thế này 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); 
     } 
    } 

Các CustomMvxWrappingCommand mất một Func như là đối số, và sau đó được gọi và chuyển vào lệnh CanExecute/Execute phương pháp. Dưới đây là một đoạn phần của lớp đó có thể nhìn như thế nào như:

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

Bạn có thể sửa đổi các lớp MvxWrappingCommand từ Mvx để thực hiện các ví dụ trên.

Việc sử dụng lên tất cả:

  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.. 
      })); 
Các vấn đề liên quan