Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mvvm 我可以从Xamarin表单中的命令内访问绑定元素吗?_Mvvm_Xamarin_Xamarin.forms_Icommand - Fatal编程技术网

Mvvm 我可以从Xamarin表单中的命令内访问绑定元素吗?

Mvvm 我可以从Xamarin表单中的命令内访问绑定元素吗?,mvvm,xamarin,xamarin.forms,icommand,Mvvm,Xamarin,Xamarin.forms,Icommand,我有一个视图,其图像具有绑定到命令的点击手势: 查看: var clickableImage = new Image(...); var imageTap = new TapGestureRecognizer(); clickableImage.GestureRecognizers.Add(imageTap); imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyComm

我有一个视图,其图像具有绑定到命令的点击手势:

查看:

var clickableImage = new Image(...);
var imageTap = new TapGestureRecognizer();
clickableImage.GestureRecognizers.Add(imageTap);
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand);

是否有任何方法可以从绑定到的命令中访问imageTap元素?

是的,您可以使用命令参数

您可以从我们表单团队的工程师那里查阅此答案/帖子。

imageTap.SetBinding(TapGestureRecognizer.CommandProperty,=>\uu.MyCommand);
//命令参数
imageTap.SetBinding(TapGestureRecognizer.CommandParameterProperty,=>imageTap);

CommandParameter
TapgestureRecognitizer
上的另一个可绑定属性,您可以在另一行上设置它。

为了更详细地解释,当您使用CommandParameter时,您绑定到的对象会在命令运行时作为命令操作的参数传入。然后必须将参数强制转换为所需的类型,以便能够使用或修改它

例如,如果您希望从命令中获取对图像元素的引用,您可以将控件设置为:

var clickableImage = new Image (...);
var imageTap = new TapGestureRecognizer();
clickableImage.GestureRecognizers.Add(imageTap);
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand);
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => clickableImage); // clickableImage will be passed to MyCommand when it is run

嗯,在C代码(与XAML)中会是什么样子?在命令本身内部,我将如何引用绑定元素?当我尝试这样做时,我得到一个错误“指定的强制转换无效”,与CommandParameterProperty行直接相关。无论谁否决了,请告诉我原因。如果你不加解释就否决投票,我什么也学不到。其他人已经发布了关于如何使用命令参数实现这一点的解决方案,我只想补充一点,你可能应该重新思考为什么要这么做。该命令位于ViewModel内部,ViewModel不应该了解您的视图,而应该了解您的视图。MVVM将这些层完全分开,如果您传递对映像的引用或依赖于视图中的Xamarin.Forms名称空间,那么您将遍历这些层model@irreal-因此,我有一个自定义元素(基本上是一个带有图标的块和各种文本位),它有4种变体。基于变量,我希望命令执行稍微不同的操作-因此,命令需要知道我的自定义元素是什么变量。通过将元素传递到命令参数中,我可以做到这一点。这有意义吗?或者你仍然认为我的方法有问题吗?我仍然认为它有问题。viewmodel应该包含逻辑状态。您的描述有点过于笼统,但通常情况下,viewmodel应该包含其状态数据以及处理该数据的函数(命令)。然后,视图可以读取状态数据并相应地显示它,还可以调用命令对其进行操作。视图应该只保存对应用程序逻辑没有影响的状态数据。例如活动选项卡、动画进程等。我是MVVM新手,因此如果我的方法不太正确,我不会感到惊讶。但是,让我给你一个更具体的例子,说明我正在尝试做的事情。假设我有4个按钮。单击这些按钮中的每一个都会调用自定义弹出模式(不是Navigation.PushModalAsync(),而是您可以在后台看到当前页面变暗的那种,并且在其上有一个弹出窗口),但是每个模式都会根据您单击的按钮显示不同的内容。我的意思是我可以有4个不同的命令。但是为什么我不能只使用一个命令并传入一个参数呢?当我尝试这样做时,我会得到一个错误“指定的强制转换无效”,直接与CommandParameterProperty行有关。哦,那是因为它在MyViewModel类中查找属性,而clickableImage不是属性,也不是MyViewModel中的属性。你能分享一些关于你想完成什么的更多信息吗?一般来说,ViewModel不应该在严格的MVVM意义上了解视图。如果我知道你的最终目标是什么,我很乐意帮忙。
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand);
//Command parameter
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => imageTap);
var clickableImage = new Image (...);
var imageTap = new TapGestureRecognizer();
clickableImage.GestureRecognizers.Add(imageTap);
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand);
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => clickableImage); // clickableImage will be passed to MyCommand when it is run
public ICommand MyCommand
{
    get
    {
        return new Command((parameter) => // the bound parameter (the Image element in this case) is passed in as an object
        {               
            var clickableImage = (Image)parameter; // cast the parameter object to an Image.
            // Use the element for whatever you need
            ...
        });
    }
}