如何判断在使用 Xamarin.Forms 创建的 TimePicker 上单击了“确定”还是“取消”?

How can I tell if OK or Cancel was clicked on a TimePicker created with Xamarin.Forms?

我正在开发一个基于 Xamarin.Forms 的 android 应用程序,我创建了一个显示 TimePicker(不是 TimePickerDialog)的自定义对话框。

到目前为止一切正常,除了我只找到一种方法来检查用户是否在 TimePicker 中进行了选择,即 TimePicker.Unfocused。

遗憾的是,该事件没有 return 选择器中的两个按钮中的哪一个被单击:(

我尝试通过节省我最初创建 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 +=.

我想出了一个解决方法:通过将初始时间设置为带秒的时间,例如最后的 1 秒,可以将时间与初始时间进行比较。 如果秒数仍然存在,则用户单击了取消。

TimePicker Class 缺少例如在 DatePicker class ("DateSeleted")

中找到的事件“TimeSelected”

但是!

如果您查找 TimePicker Class,您可以看到那里有一些 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 - > 时间.

您还可以在 xaml 中订阅 PropertyChanged 事件并检查 属性 的名称是否与您要查找的名称相同。

出于调试目的,创建该方法,放置一个断点并查找 event.PropertyName,并观察断点被击中几次,属性 的名称在创建 TimePicker 时会有所不同, 点击确定等