Mvvm 超宽带时间选择器

Mvvm 超宽带时间选择器,mvvm,uwp-xaml,Mvvm,Uwp Xaml,将时间选择器的时间属性获取到ViewModel时遇到问题。ViewModel上的方法 TimePickerTimeSelected() 在更新时间属性之前调用 private DateTimeOffset _datePickerValue; public DateTimeOffset datePickerValue { get => _datePickerValue; set => SetProperty(ref _datePickerValue, value

将时间选择器的时间属性获取到ViewModel时遇到问题。ViewModel上的方法

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}">

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

为了获得所需的输出,请参考以下代码:

Xaml:

编辑

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

XAML:

视图模型:

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

  public void TestTimeChangedEvent(object sender, TimePickerValueChangedEventArgs e)
  {
     TimePickerValue = e.NewTime;
  }
 public void OnTimePickerTimeSelected(TimeSpan selectedTime)
 {
     // Your Logic       
 }

是的,谢谢,这确实有效,但是你对UI的依赖性和TimePickerVaueChanged,这是我希望避免的。有没有办法使用MVVM?您通常会在viewmodel中设置属性,这就是获取值的方式。否则就没有理由让时间选择器来了。谢谢你全面的回答。太棒了,先生!
  private TimeSpan _timePickerValue;
  public TimeSpan TimePickerValue
  {
     get { return _timePickerValue; }
     set { _timePickerValue = value;}
  }

  public void TestTimeChangedEvent(object sender, TimePickerValueChangedEventArgs e)
  {
     TimePickerValue = e.NewTime;
  }
 <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       
 }