UWP 时间选择器 MVVM

UWP TimePicker MVVM

我在将 TimePicker 的时间 属性 放入 ViewModel ViewModel.The 方法时遇到问题

TimePickerTimeSelected()

被调用,但在时间 属性 更新之前。

private DateTimeOffset _datePickerValue;
public DateTimeOffset datePickerValue
 {
     get => _datePickerValue;
     set => SetProperty(ref _datePickerValue, value);
 }

这是XAML

<TimePicker
     Name="timePicker"
     Time="{x:Bind viewModel.timePickerValue,Mode=TwoWay}"
     TimeChanged="{x:Bind viewModel.TimePickerTimeSelected,Mode=TwoWay}">

我想对在控件中选中的时间做一些处理,但是在 timePickerValue 为 updated.How 之前调用了方法,我能得到新的时间吗?视图模型方法:

  public void TimePickerTimeSelected()
  {

  }

在您的 Xaml 中,您将 Mode=TwoWay 设置为 TimeChanged 无效的事件,因为 TmeChange 是事件而不是 DependencyProperty

为了达到想要的效果请参考下面的代码:

Xaml:

<TimePicker
   Name="timePicker"
   Time="{x:Bind ViewModel.TimePickerValue, Mode=TwoWay}"
   TimeChanged="{x:Bind ViewModel.TestTimeChangedEvent}"/>

视图模型:

  private TimeSpan _timePickerValue;
  public TimeSpan TimePickerValue
  {
     get { return _timePickerValue; }
     set { _timePickerValue = value;}
  }

  public void TestTimeChangedEvent(object sender, TimePickerValueChangedEventArgs e)
  {
     TimePickerValue = e.NewTime;
  }

编辑

由于您不想在 ViewModel 中使用 TimePickerValueChangedEventArgs,因此您必须创建自定义行为以在 VM 中获取选定的时间。

XAML:

 <TimePicker
     Name="timePicker">
    <Interactivity:Interaction.Behaviors>
       <behaviors:TimeChangedEventBehavior/>
    </Interactivity:Interaction.Behaviors>
 </TimePicker>

行为:

  public sealed class TimeChangedEventBehavior : DependencyObject, IBehavior
    {
        public DependencyObject AssociatedObject { get; private set; }

        public void Attach(DependencyObject associatedObject)
        {
            if (!(associatedObject is TimePicker tp))
            {
                throw new ArgumentException("Error Associating Object");
            }

            this.AssociatedObject = associatedObject;

            tp.TimeChanged += OnTimeChanged;
        }

        private void OnTimeChanged(object sender, TimePickerValueChangedEventArgs e)
        {
            var timePicker = (sender as TimePicker);
            var mainVM = (timePicker.DataContext as MainViewModel);
            mainVM.OnTimePickerTimeSelected(timePicker.Time);
        }

        public void Detach()
        {
            if (this.AssociatedObject is TimePicker tp)
            {
                tp.TimeChanged -= this.OnTimeChanged;
            }
        }
    }

视图模型:

 public void OnTimePickerTimeSelected(TimeSpan selectedTime)
 {
     // Your Logic       
 }