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