2010-10-03 43 views
0

結合滑塊時,我有在XAML影片進度滑塊這樣的:無限循環中MVVM

<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); 
} 

...但現在我在一個視圖模型我無法再訪問我的滑塊控件。

是否有另一種方法來禁用無限循環/事件處理程序?

+0

請添加虛擬機代碼。 – 2010-10-03 10:57:27

+0

增加了額外的澄清代碼。 – DaveO 2010-10-04 04:55:46

回答

0

考慮將邏輯從seekSlider_ValueChanged移至ViewModel中Position屬性的設置者。