Бесконечный цикл при связывании слайдера в MVVM - PullRequest
0 голосов
/ 03 октября 2010

У меня есть ползунок прогресса видео в XAML, таким образом:

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

И код в моей модели просмотра для обновления Position on 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 я просто отключал обработчик событий Slider.ValueChanged () во время UpdatePosition:

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

... но теперь я нахожусь в модели представления, у меня больше нет доступа к элементу управления ползунком.

Есть ли другой способ отключить бесконечный цикл / обработчик событий?

1 Ответ

0 голосов
/ 11 мая 2011

Рассмотрите возможность перемещения логики из seekSlider_ValueChanged в установщик свойства Position в вашем ViewModel.

...