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
}
我在将 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
}