C# 如何从命令对象中访问整个ViewModel

C# 如何从命令对象中访问整个ViewModel,c#,android,xamarin,model-binding,mvvmcross,C#,Android,Xamarin,Model Binding,Mvvmcross,基于@stuart的,我可以看到如何将文本字符串绑定为CommandParameter local:MvxBind="Click FindUserCommand, CommandParameter=foo" 当命令位于其自己的命令对象而不是ViewModel中时,如何将整个ViewModel绑定为按钮的CommandParameter public void Execute(object parameter) { var vm = (FindUserViewModel)paramet

基于@stuart的,我可以看到如何将文本字符串绑定为CommandParameter

local:MvxBind="Click FindUserCommand, CommandParameter=foo"

当命令位于其自己的命令对象而不是ViewModel中时,如何将整个ViewModel绑定为按钮的CommandParameter

public void Execute(object parameter)
{
    var vm = (FindUserViewModel)parameter;
    var firstName = vm.FirstName;
    var lastName = vm.LastName;
    // etc...
}
注意:如果我必须以某种方式扩展MvvmCross,以使此函数以类似于WPF的统一方式运行,我可以接受。。我只是不知道从哪里开始。


我发现的所有示例都直接在ViewModel中声明该命令,如下所示:

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

private cirries.MvvmCross.ViewModels.MvxCommand\u insertCommand;
public System.Windows.Input.ICommand InsertCommand
{
得到
{
_insertCommand=_insertCommand??new cirrial.MvvmCross.ViewModels.MvxCommand(DoInsert);
返回_insertCommand;
}
}
私有整数_countAdded=0;
私有void DoInsert()
{
_countAdded++;
var kitten=_kittengenseseservice.CreateNewKitten(_countAdded.ToString());
_dataService.Insert(kitten);
刷新数据计数();
}
然后将按钮绑定到视图,如下所示:

<Button
    android:text="Insert"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button1"
    local:MvxBind="Click InsertCommand" />
命令对象定义:

公共类FindUserCommand:ICommand
{
专用只读IUserService\u userService;
公共FindUserCommand(IUserService用户服务)
{
_userService=userService;
}
公共布尔CanExecute(对象参数)
{
var findUserViewModel=(findUserViewModel)参数;
返回findUserModel.NameSearch.Length>0;
}
public void Execute(对象参数)
{
FindUserViewModel.Users=_userService.Find(FindUserViewModel.NameSearch);
}
公共事件处理程序CanExecuteChanged;
公共无效RASECANEXECUTECHANGED()
{
如果(CanExecuteChanged!=null)
CanExecuteChanged(这是新的EventArgs());
}
}
Android小部件(如按钮)默认情况下没有Command和CommandParameter成员,因此无法“开箱即用”使用它们

但是,您可以很容易地从
按钮继承来生成
MyButton
,然后您可以提供
Command
CommandParameter
成员(如果您愿意),例如:

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; }
}
使用此选项,您可以在axml中使用
MyButton
而不是
Button

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


有关数据绑定的更多信息,请参见



或者,另一种方法是使用基于ValueConverter的方法-类似于MvvmCross提供的CommandParameter功能-请参见使用
local:MvxBind=“单击FindUserCommand,CommandParameter=ViewModel
我可以看到
执行(参数)
参数值==”ViewModel“。我如何才能使它成为整个ViewModel对象?我一直在研究这个自定义按钮位,但它对我来说并不是一个整体。我已经更新了问题并添加了悬赏。如果你感兴趣的话……太棒了,这一行为我做了
Command SearchCommand;CommandParameter。
作为后续操作,是否可以根据命令的“CanExecute”状态启用/禁用按钮?
 <MyButton
     local:MvxBind="Command SearchCommand;CommandParameter ." />