如何在ObservableObject视图模型中获取Content Page的Slider值
解决方案
1. 绑定Slider值到ViewModel
首先确保AppViewModel实现了INotifyPropertyChanged接口,然后添加可绑定的滑块值属性:
private double _sliderValue; public double sliderValue { get => _sliderValue; set { if (_sliderValue != value) { _sliderValue = value; OnPropertyChanged(nameof(sliderValue)); } } }
修改XAML中的Slider,添加双向绑定以同步值:
<Slider x:Name="slider" Maximum="90" HorizontalOptions="Start" WidthRequest="400" Value="{Binding sliderValue, Mode=TwoWay}"/>
2. 让ObservableCollection中的项获取滑块值
方案一:通过弱引用持有ViewModel
在UserItem类中添加对ViewModel的弱引用(避免内存泄漏):
private WeakReference<AppViewModel> _viewModelRef; // 修改构造函数,传入ViewModel实例 public UserItem(AppViewModel viewModel) { _viewModelRef = new WeakReference<AppViewModel>(viewModel); }
添加用户时传入ViewModel实例:
// 在AppViewModel的AddPlayer方法中 public void AddPlayer() { UserItems.Add(new UserItem(this) { Name = NewName }); NewName = string.Empty; }
修改OnTimedEvent方法,正确获取滑块值并切换到UI线程更新:
public void OnTimedEvent(object? source, System.Timers.ElapsedEventArgs e) { if (_viewModelRef.TryGetTarget(out var vm) && CurrentTimeOn.TotalMinutes > vm.sliderValue) { // Timer回调在后台线程,必须切换到UI线程更新UI属性 Application.Current.Dispatcher.Dispatch(() => { Labcolor = Color.FromRgb(255, 0, 0); OnPropertyChanged(nameof(Labcolor)); }); } }
方案二:使用消息传递(MessagingCenter)
在AppViewModel的滑块属性变化时发送更新消息:
public double sliderValue { get => _sliderValue; set { if (_sliderValue != value) { _sliderValue = value; OnPropertyChanged(nameof(sliderValue)); // 发送滑块值更新消息 MessagingCenter.Send(this, "SliderValueUpdated", value); } } }
在UserItem中订阅消息并保存最新值:
private double _currentSliderValue; public double CurrentSliderValue { get => _currentSliderValue; set { _currentSliderValue = value; OnPropertyChanged(nameof(CurrentSliderValue)); } } public UserItem() { // 订阅滑块值更新消息 MessagingCenter.Subscribe<AppViewModel, double>(this, "SliderValueUpdated", (sender, newValue) => { CurrentSliderValue = newValue; }); }
修改OnTimedEvent使用本地保存的滑块值:
public void OnTimedEvent(object? source, System.Timers.ElapsedEventArgs e) { if (CurrentTimeOn.TotalMinutes > CurrentSliderValue) { Application.Current.Dispatcher.Dispatch(() => { Labcolor = Color.FromRgb(255, 0, 0); OnPropertyChanged(nameof(Labcolor)); }); } }
关键注意点
- 原代码用
CurrentTimeOn.Seconds对比滑块值(分钟单位)逻辑错误,改为CurrentTimeOn.TotalMinutes System.Timers.Timer的回调在后台线程,必须通过Dispatcher切换到UI线程更新UI相关属性
内容的提问来源于stack exchange,提问作者Aeneas
相关产品推荐
相关产品推荐

