OpenFileDialogService

  • 5 min to read

The OpenFileDialogService is an IOpenFileDialogService implementation that allows you to browse and open files in the File System by using the standard dialog box.

OpenFileDialogServiceImage

To implement the file browsing functionality in accordance with the MVVM pattern, use the OpenFileDialogService class provided by MVVM Framework.

Using the OpenFileDialogService functionality requires a OpenFileDialogService instance to be attached to a View. You can do this by using the Smart Tag as described in Attaching MVVM Behaviors and Services or manually as shown in the code snippet below.

<UserControl x:Class="FileDialogServicesSample.Views.FileDialogsView"
    ...
    xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:OpenFileDialogService />
    </dxmvvm:Interaction.Behaviors>
</UserControl>

To show the dialog box, access the attached OpenFileDialogService (a description on how to obtain a service from a View Model is available here: Services in POCO objects and Services in ViewModelBase descendants) and invoke its IOpenFileDialogService.ShowDialog method.

[POCOViewModel]
public class FileDialogsViewModel {
    protected IOpenFileDialogService OpenFileDialogService { get { return this.GetService<IOpenFileDialogService>(); } }
    ...
    public void Open() {
        if (OpenFileDialogService.ShowDialog()) {
            ...
        }
    }
}

When the shown dialog is closed and the ShowDialog method returns True, you can obtain the selected file in the IOpenFileDialogService.File property. If the OpenFileDialogService.Multiselect feature is enabled and multiple files are selected, use the IOpenFileDialogService.Files property instead.

NOTE

The OpenFileDialogService uses its own FileInfoWrapper class implementing the IFileInfo interface to represent the selected file(s). This class provides the capabilities of the standard FileInfo to work with objects of the FileStream type.

If you want to enable the user with the ability to select a folder instead of a file, use the FolderBrowserDialogService instead.

Example

Imports DevExpress.Mvvm
Imports DevExpress.Mvvm.DataAnnotations
Imports DevExpress.Mvvm.POCO
Imports System.IO
Imports System.Linq

Namespace FileDialogServicesSample.ViewModels
    <POCOViewModel> _
    Public Class FileDialogsViewModel
        #Region "Common properties"
        Public Overridable Property Filter() As String
        Public Overridable Property FilterIndex() As Integer
        Public Overridable Property Title() As String
        Private privateDialogResult As Boolean
        Public Overridable Property DialogResult() As Boolean
            Get
                Return privateDialogResult
            End Get
            Protected Set(ByVal value As Boolean)
                privateDialogResult = value
            End Set
        End Property
        Private privateResultFileName As String
        Public Overridable Property ResultFileName() As String
            Get
                Return privateResultFileName
            End Get
            Protected Set(ByVal value As String)
                privateResultFileName = value
            End Set
        End Property
        Public Overridable Property FileBody() As String
        #End Region

        #Region "SaveFileDialogService specific properties"
        Public Overridable Property DefaultExt() As String
        Public Overridable Property DefaultFileName() As String
        Public Overridable Property OverwritePrompt() As Boolean
        #End Region

        Protected ReadOnly Property SaveFileDialogService() As ISaveFileDialogService
            Get
                Return Me.GetService(Of ISaveFileDialogService)()
            End Get
        End Property
        Protected ReadOnly Property OpenFileDialogService() As IOpenFileDialogService
            Get
                Return Me.GetService(Of IOpenFileDialogService)()
            End Get
        End Property

        Public Sub New()
            Filter = "Text Files (.txt)|*.txt|All Files (*.*)|*.*"
            FilterIndex = 1
            Title = "Custom Dialog Title"
            DefaultExt = "txt"
            DefaultFileName = "Document1"
            OverwritePrompt = True
        End Sub

        Public Sub Open()
            OpenFileDialogService.Filter = Filter
            OpenFileDialogService.FilterIndex = FilterIndex
            DialogResult = OpenFileDialogService.ShowDialog()
            If Not DialogResult Then
                ResultFileName = String.Empty
            Else
                Dim file As IFileInfo = OpenFileDialogService.Files.First()
                ResultFileName = file.Name
                Using stream = file.OpenText()
                    FileBody = stream.ReadToEnd()
                End Using
            End If
        End Sub

        Public Sub Save()
            SaveFileDialogService.DefaultExt = DefaultExt
            SaveFileDialogService.DefaultFileName = DefaultFileName
            SaveFileDialogService.Filter = Filter
            SaveFileDialogService.FilterIndex = FilterIndex
            DialogResult = SaveFileDialogService.ShowDialog()
            If Not DialogResult Then
                ResultFileName = String.Empty
            Else
                Using stream = New StreamWriter(SaveFileDialogService.OpenFile())
                    stream.Write(FileBody)
                End Using
            End If
        End Sub

    End Class
End Namespace