UWP时间选择器MVVM



我在将TimePicker的Time属性获取到我的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}">

我想对在控件中选择的时间进行一些处理,但该方法是在更新timePickerValue之前调用的。如何获得新时间?ViewModel方法:

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

ViewModel:

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

ViewModel:

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

最新更新