所以我有一个媒体元素和一个滑块 我想将 MediaElement 的Position属性绑定到ViewModel中的滑块
如: -
<Slider
x:Name="PositionSlider"
Minimum="0"
Maximum="{Binding Position,Mode=TwoWay"/>
<MediaElement
x:Name="mediaElement"
Position="{Binding Position,Mode=TwoWay"/>
但我不能bind position of the media element since it's not a dependency property
。
有没有其他方法可以实现这个目标?
答案 0 :(得分:2)
你可以实现一个可绑定的附加属性,当它的值发生变化时,它会改变媒体元素的位置。
附属物的定义如下:
public class MediaElementExtension
{
public static TimeSpan GetBindablePosition(DependencyObject obj)
{
return (TimeSpan)obj.GetValue(BindablePositionProperty);
}
public static void SetBindablePosition(DependencyObject obj, double value)
{
obj.SetValue(BindablePositionProperty, value);
}
// Using a DependencyProperty as the backing store for BindablePosition. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BindablePositionProperty =
DependencyProperty.RegisterAttached("BindablePosition", typeof(TimeSpan), typeof(MediaElementExtension), new PropertyMetadata(new TimeSpan(), BindablePositionChangedCallback));
private static void BindablePositionChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MediaElement mediaElement = d as MediaElement;
if (mediaElement == null) return;
mediaElement.Position = (TimeSpan)e.NewValue;
}
}
现在您可以按如下方式使用它:
<MediaElement local:MediaElementExtension.BindablePosition="{Binding SomePropertyFromViewModel}" />