OpenFileDialogService
- 5 minutes 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.
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 Quick Actions as described in Quick Actions 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 ShowDialog(Action<CancelEventArgs>, String) 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