【问题标题】:How to upload a file with Prism library in WPF application?如何在 WPF 应用程序中使用 Prism 库上传文件?
【发布时间】:2018-11-12 14:07:02
【问题描述】:

我在Prism Library上面写了一个WPF应用程序

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

【问题讨论】:

    标签: c# wpf mvvm file-upload prism


    【解决方案1】:

    在 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,汤姆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 2022-06-10
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多