You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:24:51