如何在 WPF 应用程序中使用 Prism 库上传文件?

How to upload a file with Prism library in WPF application?

我有一个 WPF 应用程序写在 Prism Library

的顶部

我想允许用户从他们的个人资料上传个人资料照片。在他们的编辑个人资料视图中,我添加了以下 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,如何正确显示文件浏览器?那如何才能将选中的文件上传到内存中呢?

在WPF和MVVM中显示文件打开对话框通常的方式是使用一个服务,它代表一个打开文件对话框。您应该使用 Prism 中常用的 IoC 方法将此服务注入您的 ViewModel。

此服务接口不应依赖于任何特定的ui方法(通常很容易在命令行测试或单元测试模拟中实现)。

服务的实现应该在依赖WPF的项目中,这个实现应该调用OpenFileDialog打开文件。

您的按钮命令应调用服务实例,传递给 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,汤姆