【问题标题】:Xamarin.Forms TimePicker "Time" Binding not settable?Xamarin.Forms TimePicker“时间”绑定不可设置?
【发布时间】:2017-09-27 13:04:05
【问题描述】:

在多个Views 上,我有TimePickers,我想将其设置为某个时间,但它们总是显示00:00。 它们是这样设置的:

<controls:ExtendedTimePicker VerticalOptions="FillAndExpand"
                             HorizontalOptions="EndAndExpand"
                             TextColor="#FFFFFF"
                             Time="{Binding SaveTime, Mode=TwoWay}" />

或者像这样:

<TimePicker Grid.Row="1"
            Grid.Column="1"
            Format="HHmm"
            Time="{Binding SaveTime, Mode=TwoWay}"
            BackgroundColor="#FFFFFF" />

为了澄清,ExtendedTimePicker 来自Xlabs.Forms 库。因为它继承自TimePicker,所以它也有同样的问题。我也尝试了所有的绑定模式,但都得到了与00:00相同的结果。

在我的ViewModels 中,我尝试在构造函数中设置绑定属性,将其延迟几百毫秒,或者在收到来自MessagingCenter 的特定消息时设置它。无论何时设置,显示的时间都不会改变。不过,在我将属性设置为某个时间后,将访问绑定属性的 getter。
属性定义为:

private TimeSpan _SaveTime;
public TimeSpan SaveTime
{
    get { return _SaveTime; }
    set { SetProperty(ref _SaveTime, value); }
}

SetProperty 导致:

public abstract class ViewModelBase : IViewModel, IDisposable
{
    protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (object.Equals(storage, value)) return false;

        storage = value;
        OnPropertyChanged(propertyName);

        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

那么,这是一个错误吗?有什么可以解决的吗?一种解决方法?某物?也许是更新?
我正在与:
VisualStudio 2017 15.2
Xamarin 4.5.0
Xamarin.Forms 2.3.4.267

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    尝试使用此代码从您的 ViewModel 设置您的属性,以确保它由 UI 线程设置:

    Device.BeginInvokeOnMainThread(() => SaveTime = yourTimeSpan);
    

    如果不行,可以把设置属性的那一行贴出来吗?

    【讨论】:

    • 我在ViewModel 的构造函数中尝试了你的行,但没有成功。我更进一步,将该属性的私有字段设置为private TimeSpan _SaveTime = new TimeSpan(15, 14, 13);,以便第一次访问该属性时将返回不是00:00:00TimeSpan。同样的结果,TimePicker 显示 00:00,尽管属性返回 15:14:13(用断点检查)。
    • 即使给 TimePicker 一个x:Name,并在 CodeBehind 中设置时间也无济于事。还是00:00
    【解决方案2】:

    好吧,真丢脸。我有一个用于TimePickerExtendedTimePicker 的自定义渲染器,它修复了旧版本Xamarin.Forms 中的另一个错误,其中TimePickerDialog 将始终采用12H 格式,无论我输入什么格式。从我的代码中删除类后,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多