【问题标题】:Infinite Loop when binding slider in MVVM在 MVVM 中绑定滑块时无限循环
【发布时间】:2010-10-03 00:30:03
【问题描述】:

因此,我在 XAML 中有一个视频进度滑块:

<Slider Minimum="0" Value="{Binding Position,Mode=OneWay}" Maximum="{Binding Duration}" IsMoveToPointEnabled="True"/>

并在我的视图模型中编写代码以更新 Clock.CurrentTimeInvalidated() 上的位置,从而使滑块保持跟踪当前进度:

private void Play()
{
Uri next = _carousel.Dequeue();
_timeline = new MediaTimeline(next);
_timeline.RepeatBehavior = RepeatBehavior.Forever;
_clock = _timeline.CreateClock();
MyMediaElement.Clock = _clock;
_clock.CurrentTimeInvalidated += new EventHandler(UpdatePosition);
_clock.Controller.Begin();
}

public void UpdatePosition(object sender, EventArgs e)
{
  Position = MyMediaElement.Position.TotalMilliseconds;
}

这很好用,除非我实现 ValueChanged 来设置 Clock.Controller.Seek():

private void seekSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
DisplayViewModel vm = (DisplayViewModel)this.DataContext;
TimeSpan ts = new TimeSpan(0, 0, 0, 0, (int)seekSlider.Value);
vm.MyMediaElement.Clock.Controller.Seek(ts, TimeSeekOrigin.BeginTime);
}

(在我的用户控件的代码隐藏中,直到我弄清楚事件到命令的路由)

此时我得到一个无限循环。以前在非 MVVM 中,我只是在 UpdatePosition 期间禁用了 Slider.ValueChanged() 事件处理程序:

public void UpdatePosition(object sender, EventArgs e)
{
  seekSlider.ValueChanged -= new EventHandler(seekSlider_ValueChanged);
  Position = MyMediaElement.Position.TotalMilliseconds;
  seekSlider.ValueChanged += new EventHandler(seekSlider_ValueChanged);
}

...但是现在我在视图模型中,我不再可以访问我的滑块控件。

还有其他方法可以禁用无限循环/事件处理程序吗?

【问题讨论】:

  • 添加了额外的代码进行说明。

标签: wpf mvvm slider viewmodel


【解决方案1】:

考虑将逻辑从 seekSlider_ValueChanged 移动到 ViewModel 中 Position 属性的设置器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2022-06-30
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多