首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UWP TimePicker MVVM

UWP TimePicker MVVM
EN

Stack Overflow用户
提问于 2018-11-22 14:03:36
回答 1查看 291关注 0票数 0

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

代码语言:javascript
复制
TimePickerTimeSelected()

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

代码语言:javascript
复制
private DateTimeOffset _datePickerValue;
public DateTimeOffset datePickerValue
 {
     get => _datePickerValue;
     set => SetProperty(ref _datePickerValue, value);
 }

这是XAML

代码语言:javascript
复制
<TimePicker
     Name="timePicker"
     Time="{x:Bind viewModel.timePickerValue,Mode=TwoWay}"
     TimeChanged="{x:Bind viewModel.TimePickerTimeSelected,Mode=TwoWay}">

我想用控件中选择它的时间进行一些处理,但是方法在timePickerValue是updated.How之前被调用,我得到新的时间了吗?ViewModel方法:

代码语言:javascript
复制
  public void TimePickerTimeSelected()
  {

  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-22 23:52:30

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

为了达到预期的输出,请参考以下代码:

Xaml:

代码语言:javascript
复制
<TimePicker
   Name="timePicker"
   Time="{x:Bind ViewModel.TimePickerValue, Mode=TwoWay}"
   TimeChanged="{x:Bind ViewModel.TestTimeChangedEvent}"/>

ViewModel:

代码语言:javascript
复制
  private TimeSpan _timePickerValue;
  public TimeSpan TimePickerValue
  {
     get { return _timePickerValue; }
     set { _timePickerValue = value;}
  }

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

编辑

由于您不希望在您的TimePickerValueChangedEventArgs中使用ViewModel,所以您必须创建一个自定义行为才能在VM中获得所选的时间。

XAML:

代码语言:javascript
复制
 <TimePicker
     Name="timePicker">
    <Interactivity:Interaction.Behaviors>
       <behaviors:TimeChangedEventBehavior/>
    </Interactivity:Interaction.Behaviors>
 </TimePicker>

行为:

代码语言:javascript
复制
  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;
            }
        }
    }

ViewModel:

代码语言:javascript
复制
 public void OnTimePickerTimeSelected(TimeSpan selectedTime)
 {
     // Your Logic       
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53432685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档