我想允许用户从他们的个人资料中上传个人资料图片。在他们的编辑个人资料视图中,我添加了以下XAML代码
<Grid Grid.Row="10"
Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox MinWidth="150" HorizontalAlignment="Stretch"
Grid.Column="0"></TextBox>
<Button Content="Browse" Command="{Binding Path=UploadImage}"
Grid.Column="1"
Margin="0 0 5 0"></Button>
</Grid>
UploadImage
命令需要显示一个对话框,以浏览用户的PC以获取图片。
使用Prims和MVVM,如何正确显示文件浏览器?那么如何将所选文件上传到内存中呢?
答案 0 :(得分:1)
在WPF和MVVM中显示文件打开对话框的常用方法是使用代表打开文件对话框的服务。您应该使用Prism中的常用IoC方法将此服务注入ViewModel。
此服务INTERFACE不应该依赖于任何特定的ui方法(通常在命令行测试或单元测试模拟中很容易实现它。)
服务的实现应该在依赖于WPF的项目中,然后该实现应该调用OpenFileDialog来打开文件。
您的button命令应调用服务实例,传递给ViewModel,然后打开对话框。
这个想法有很多实现,这里只是一个简单的实现:
public interface IOpenFileService
{
/// <summary>
/// Open file
/// </summary>
/// <returns>True if file selected</returns>
bool? OpenFile();
/// <summary>
/// Full names of the selected files
/// </summary>
string[] FileNames { get; }
}
public class OpenFileService: IOpenFileService
{
OpenFileDialog _openFileDialog = new OpenFileDialog();
string[] _selectedFileNames;
public bool? OpenFile()
{
_openFileDialog.Multiselect = true;
var ofd = _openFileDialog.ShowDialog();
if (ofd.HasValue && ofd.Value)
{
_selectedFileNames = _openFileDialog.FileNames;
}
return ofd;
}
public string[] FileNames
{
get { return _selectedFileNames ; }
}
}
所以你注册了服务的实现,你的ViewModel在构造函数中接收了实现:
public class SomeViewModel
{
public SomeViewModel(IFileOpenService fileOpen)
{
this._fileOpen = fileOpen;
}
public void FileOpenCommandExecute
{
if (this._fileOpen.OpenFile())
{
var selectedFiles = this._fileOpen.FileNames;
// .. do something with the selected files...
}
}
}
还有其他实现,它们支持许多其他对话框类型,所以你也应该查找它们,但这是一个基本的想法。
HTH,汤姆