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