我有一个ViewModel类,提供了一个类型为FileInfo的MediaFile属性,并且我想将该属性绑定到MediaElement的Source属性。问题是,MediaElement的Source属性需要一个Uri,但是在绑定中定义的转换器中,我无法访问FileInfo类的FullName属性,因为这会引发SecurityException异常。对于图片,没有问题,因为Image控件期望一个可以使用FileInfo实例流创建的ImageSource对象。如何定义绑定以便我的MediaElement获取正确的源?或如何将MediaElement传递到转换器中,以便可以调用MediaElement的SetSource(Stream)方法。
ViewModel:
public class ViewModel {
// additional code omitted
public FileInfo MediaFile {get; set;}
}
文件格式转换器:
public class FileInfoToMediaConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
var file = value as System.IO.FileInfo;
if (MediaResourceFactory.IsImage(file.Extension)) {
System.Windows.Media.Imaging.BitmapImage image = new System.Windows.Media.Imaging.BitmapImage();
image.SetSource(file.OpenRead());
return image;
}
else if (MediaResourceFactory.IsVideo(file.Extension)) {
// create source for MediaElement
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
}
绑定:
<Image Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter} }"/>
<MediaElement Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter}}/>