c# - 如何判断在使用 Xamarin.Forms 创建的 TimePicker 上单击了确定还是取消?
问题描述
我正在开发一个基于 Xamarin.Forms 的 android 应用程序,并且我创建了一个显示 TimePicker(不是 TimePickerDialog)的自定义对话框。
到目前为止,一切正常,除了我只找到一种方法来检查用户是否在 TimePicker 中进行了选择,即 TimePicker.Unfocused。
可悲的是,该事件不会返回选择器中两个按钮中的哪一个被单击:(
我尝试通过节省最初创建 TimePicker 的时间来解决这个问题,并用它来比较它是否被用户更改。现在我已经对其进行了更改,以便方便地节省您更改默认时间的需要,并注意到现在这是一个问题,因为我不再知道哪个按钮用于关闭 TimePicker。
var picker = new TimePicker() {
// if 'minutes' is set, use it's value as default value for the picker, otherwise the day beginning
Time = (minutes > -1 ? new TimeSpan(0, minutes, 0) : dayBegin),
};
picker.Unfocused += (sndr, evt) => {
var tp = (TimePicker)sndr;
var changed = tp.Time != oldTime;
if (changed) {
Debug.WriteLine("unfocused: " + tp.Time);
}
else {
Debug.WriteLine("canceled?");
}
dialog.Close(cpDialog.DialogResult.Yes);
// close my own dialog that showed the picker
};
如果 .Unfocused += 的事件除了 IsFocused 之外还包括结束选择,那就太好了。或者,如果有可选的附加事件,例如 .ClickedCancel += 和 .ClickedOK +=。
解决方案
TimePicker 类缺少例如在 DatePicker 类中找到的事件“TimeSelected”(“DateSeleted”)
但!
如果您查看 TimePicker 类,您可以看到那里有一些 BindableProperties。
其中之一是:
public static readonly BindableProperty TimeProperty;
这意味着,在您的 xaml 文件中,您可以在TimePicker 块中将TimeProperty绑定到 ViewModel 中的属性,例如:
<TimePicker x:Name="DeliveryTimePicker"
Time="{Binding TimeValue}">
</TimePicker>
(TimeValue 是我在 ViewModel 中创建的 TimeSpan 类型的属性)
当您单击 TimePicker 中的“确定”按钮时,该属性将更新。
(我相信这就是你想要的!)
(更多信息)
您也可以在 xaml 中直接绑定到其他 BindableProperties,这样做的方式是键入它们的名称,而不使用“属性”部分TimeProperty -> Time。
您还可以在 xaml 中订阅 PropertyChanged 事件并检查属性的名称是否与您要查找的名称相同。
出于调试目的,创建该方法,放置断点并查找 event.PropertyName,并观察断点被多次击中,创建 TimePicker、单击确定等时属性的名称会有所不同。
推荐阅读
- django - 在 django SignupForm 注册方法没有被覆盖
- python - 单击页面按钮后如何防止 Django 表单被重置
- javascript - 使用反应实现页脚不停留在底部
- python - 尝试使用条目小部件启用按钮
- angular - TypeError:无法读取未定义的属性“几何” - Angular
- javascript - 在没有/之前使用 JavaScript 提交表单的情况下验证表单元素
- python - 具有许多条件的 Pandas 列选择变得笨拙
- python - Python循环写入CSV文件
- python - 如何将浮点 argv 参数传递给另一个脚本?
- node.js - MulterError:使用 Node.js 和 Express 的文件太大