2013-11-20 1 views
1

@ stuart의 blog post에 기반하여 리터럴 문자열을 CommandParameter로 바인딩하는 방법을 볼 수 있습니다.Command 객체 내에서 ViewModel 전체에 액세스하는 방법

local:MvxBind="Click FindUserCommand, CommandParameter=foo" 
public class FindUserViewModel: ViewModelBase 
{ 
    public FindUserViewModel(IFindUserCommand findUserCommand) 
    { 
     _findUserCommand = findUserCommand; 
    } 

    // class truncated for brevity 

    private IFindUserCommand _findUserCommand; 
    public IFindUserCommand FindUserCommand 
    { 
     get { return _findUserCommand; } 
     set { _findUserCommand = value; RaisePropertyChanged(() = > FindUserCommand); } 
    } 
} 
public class FindUserCommand: IFindUserCommand 
{ 
    // class truncated for brevity 
    public void Execute(object parameter) 
    { 
     // RIGHT HERE: 
     // value of parameter == foo 
    } 
} 

어떻게 명령은 뷰 모델을 그 자체가 명령 개체에 살고 NOT 때이 버튼의 CommandParameter으로 전체 뷰 모델을 결합 하는가?

public void Execute(object parameter) 
{ 
    var vm = (FindUserViewModel)parameter; 
    var firstName = vm.FirstName; 
    var lastName = vm.LastName; 
    // etc... 
} 

참고 : 나는 WPF와 유사한 균일 한 방식으로이 기능을 어떻게 든 MvvmCross을 확장해야하는 경우, 내가 그와 함께 확인 해요 .. 어디서부터 시작 난 그냥 모르겠어요. 이 같은보기에있는 버튼을 바인딩 할

MvvmCross 예

private Cirrious.MvvmCross.ViewModels.MvxCommand _insertCommand; 
public System.Windows.Input.ICommand InsertCommand 
{ 
    get 
    { 
     _insertCommand = _insertCommand ? ? new Cirrious.MvvmCross.ViewModels.MvxCommand(DoInsert); 
     return _insertCommand; 
    } 
} 

private int _countAdded = 0; 

private void DoInsert() 
{ 
    _countAdded++; 
    var kitten = _kittenGenesisService.CreateNewKitten(_countAdded.ToString()); 
    _dataService.Insert(kitten); 
    RefreshDataCount(); 
} 

그리고 :


모든 예제는이 같은 뷰 모델에 직접 명령을 선언 찾을 수 있습니다 :

<Button 
    android:text="Insert" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/button1" 
    local:MvxBind="Click InsertCommand" /> 

하지만 더 많은 테스트 할 수 있도록 자체 클래스 파일에서 Command 개체를 선언하고 ViewModel에 주입해야합니다.

WPF에서 명령 매개 변수 바인딩을 수행하는 것과 비슷한 Android 용 MVVMCross에서 CommandParameter 바인딩을 사용할 수 있습니까?


WPF 예 :

보기 버튼 정의 :

<Button 
    Command="{Binding SearchCommand}" 
    CommandParameter="{Binding}"/> 

뷰 모델 명령 속성 :

private ICommand _findUserCommand; 
public ICommand FindUserCommand 
{ 
    get { return _findUserCommand; } 
    set { _findUserCommand = value; RaisePropertyChanged(() => FindUserCommand); } 
} 

명령 개체 정의 :

,
public class FindUserCommand : ICommand 
{ 
    private readonly IUserService _userService; 

    public FindUserCommand(IUserService userService) 
    { 
     _userService = userService; 
    } 

    public bool CanExecute (object parameter) 
    { 
     var findUserViewModel = (FindUserViewModel)parameter; 
     return findUserViewModel.NameSearch.Length > 0; 
    } 

    public void Execute (object parameter) 
    { 
     FindUserViewModel.Users = _userService.Find(FindUserViewModel.NameSearch); 
    } 

    public event EventHandler CanExecuteChanged; 
    public void RaiseCanExecuteChanged() 
    { 
     if (CanExecuteChanged != null) 
      CanExecuteChanged(this, new EventArgs()); 
    } 
} 

답변

2

Android 위젯 (버튼과 같은)에는 기본적으로 Command 및 CommandParameter 멤버가 없으므로 "기본적으로"사용할 수 없습니다.

그러나, 당신은 쉽게 MyButton을 생산하는 Button에서 상속 할 수 있고 당신이 원하는 경우는 CommandCommandParameter 멤버를 제공 할 수 있습니다 - 예를 들어,뭔가 같은 :

public class MyButton : Button 
{ 
    public MyButton(Context c, IAttributeSet a) : base(c,a) 
    { 
     Click += (s,e) => { 
      if (Command == null) return; 
      if (!Command.CanExecute(CommandParameter)) return; 
      Command.Execute(CommandParameter); 
     }; 
    } 

    public ICommand Command { get;set; } 
    public object CommandParameter { get;set; } 
} 

이를 사용하여 데이터 바인딩 또는 https://github.com/MvvmCross/MvvmCross/wiki/Databinding


볼에, 당신은 자세한 내용은 당신의 axml

<MyButton 
    local:MvxBind="Command SearchCommand;CommandParameter ." /> 

MyButton 대신 Button을 사용할 수 있습니다 이 작업을 수행하는 또 다른 방법은 ValueConverter 기반 접근 방식을 사용하는 것입니다. - MvvmCross와 함께 제공되는 CommandParameter 기능과 비슷합니다. - '로컬 : MvxBind = "를 사용하여 http://slodge.blogspot.co.uk/2013/06/commandparameter-binding.html

+0

을 참조하십시오. FindUserCommand, CommandParameter = ViewModel을 클릭하십시오.'Execute (parameter) '매개 변수 값 =="ViewModel "을 볼 수 있습니다. 어떻게하면 전체 ViewModel 객체가 될 수 있습니까? –

+0

나는이 사용자 정의 버튼 비트를 조사 해왔다. 질문을 업데이트하고 현상금을 추가했습니다. 만약 당신이 관심이 있으시다면 ... –

+0

이 라인은 저에게'Command SearchCommand; CommandParameter .'를 해주었습니다. 후속 조치로서, 명령의 "CanExecute"상태를 기반으로 버튼을 활성화/비활성화 할 수 있습니까? –