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
Xamarin 如何使ViewCell的点击事件向通用函数发送参数,然后为该ViewCell元素打开选择器?_Xamarin_Xamarin.forms - Fatal编程技术网

Xamarin 如何使ViewCell的点击事件向通用函数发送参数,然后为该ViewCell元素打开选择器?

Xamarin 如何使ViewCell的点击事件向通用函数发送参数,然后为该ViewCell元素打开选择器?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,更新:提醒一下,如果有人能告诉我如何在不使用手势的情况下实现此功能,则可获得500分奖励> 我使用一个ViewCell和一个手势识别器打开一个选择器,代码如下。ViewCell左侧有一个标签,右侧有一个标签区域,该区域最初在应用程序启动时填充,稍后在单击ViewCell时使用选择器填充 XAML C#这适用于使用CommandParameter的不同选择器(ati、bti、pti等) publicsettingspage() { 初始化组件(); BindingContext=新的Comma

更新:提醒一下,如果有人能告诉我如何在不使用手势的情况下实现此功能,则可获得500分奖励>

我使用一个ViewCell和一个手势识别器打开一个选择器,代码如下。ViewCell左侧有一个标签,右侧有一个标签区域,该区域最初在应用程序启动时填充,稍后在单击ViewCell时使用选择器填充

XAML


C#这适用于使用CommandParameter的不同选择器(ati、bti、pti等)

publicsettingspage()
{
初始化组件();
BindingContext=新的CommandViewModel();
}
void atiPickerSelectedIndexChanged(对象发送方,事件参数e)
{
变量选取器=(选取器)发送器;
int selectedIndex=picker.selectedIndex;
如果(已选择索引!=-1)
{
App.DB.UpdateIntSetting(Settings.Ati,selectedIndex);
atiLabel.Text=AS.ati.Text();
}
}
void pTickerSelectedIndexChanged(对象发送方,事件参数e)
{
变量选取器=(选取器)发送器;
int selectedIndex=picker.selectedIndex;
如果(已选择索引!=-1)
{
App.DB.UpdateIntSetting(Settings.Pti,selectedIndex);
ptilab.Text=AS.pti.Text();
}
}
公共类CommandViewModel:ObservableProperty
{
公共ICommand和openPickerCommand;
公共命令视图模型()
{
openPickerCommand=新命令(PickerFocus);
//openPickerCommand=新命令(点击);
}
公共ICommand和OpenPickerCommand
{
获取{return openPickerCommand;}
}
无效选择器焦点(选择器参数)
{
参数Focus();
}
}
我想取消TapGestureRecognitors的使用,但我仍然希望保留其功能和布局

有人向我建议,如果我像这样使用ViewCell的点击事件会更好:

 Tapped="OnTapped"
有人能详细解释一下我是如何用C#把这个连接起来的吗。我最好在CommandViewModel和C#backing代码中编写一些东西。视图模型是否也可以有一个方法接受一个参数,以便可以使用它打开不同的选择器

如果能举一个我能做到这一点的例子,我将不胜感激。请注意,如果有一种方法可以通过在.cs支持代码中编码来实现这一点,那么我并不特别需要使用CommandViewModel

  • 第一个问题是混合了代码隐藏和MVVM 在同一代码中的方法。这是令人困惑的,当然不是问题所在 编写您想要实现的目标的正确方法。所以,所有的命令都必须执行 将ViewModel附加到视图中,没有代码隐藏 代码仅用于UI效果。
    • 无需为所有视觉项目定义手势识别器,因为您只想检测viewcell所有表面上的点击。要实现这一点,必须使用InputTransparent=true定义ViewCell的所有子项。因此,该点击将不会被检测到,并将被父ViewCell(您)捕获 必须指明InputTransParent,因为没有点击事件 以X.Forms形式冒泡)
    • 显示和隐藏选择器是视图问题,而不是ViewModel问题。因此,这里可以使用一些代码来为ViewCell事件创建事件处理程序。此处理程序将仅在选择器上设置visible=true
    • 选择器选择的事件必须连接到ViewModel中的相应命令。因此,每次显示选择器并选择值时,viewmodel都会意识到该操作。这是viewmodel中唯一需要的命令。根据XForms版本的不同,picker没有bindable命令,因此可以使用web上的众多“bindablepicker”实现之一,也可以使用XAML EventToCommand行为
因此有两个不同的问题:显示/隐藏选择器,这可以直接在XAML中实现,也可以借助一点代码来实现;以及必须使用viewmodel中的命令管理的选择器项选择

希望这能对你有所帮助(为糟糕的英语感到抱歉)

尽管不是最佳实践,但我想您可以这样做,放弃viewmodel:

XAML:


C#:

private void OpenPickerCommand(对象发送方,System.EventArgs e)
{
if(发送方!=null)
{
选择器pkr=发送器==ati?ATIPECKER:PTIPECKER;
pkr.Focus();
}
}
回答您的问题“视图模型是否可以有一个接受参数的方法?”,这正是您使用“OpenPickerCommand”方法所做的。问题在于,使用ViewCell的公共事件“Tapped”,无法为委托处理程序设置参数

让我知道它是否适合您,或者您是否需要更多信息


我希望它有帮助。

您可以使用附加属性解决此问题。只需为添加命令/参数属性的ViewCell定义一个“行为”类

公共静态类TappedCommandViewCell
{
私有常量字符串TappedCommand=“TappedCommand”;
私有常量字符串TappedCommandParameter=“TappedCommandParameter”;
公共静态只读BindableProperty TappedCommandProperty=
BindableProperty.CreateAttached(
TappedCommand,
类型(ICommand),
类型(TappedCommandViewCell),
默认值(ICommand),
BindingMode.OneWay,
无效的
财产变更);
公共静态只读BindableProperty TappedCommandParameter