C# 如何从命令对象中访问整个ViewModel
基于@stuart的,我可以看到如何将文本字符串绑定为CommandParameterC# 如何从命令对象中访问整个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
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 ." />