废话不多说直接上代码
视图:
<UserControl xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars" xmlns:dxr="http://schemas.devexpress.com/winfx/2008/xaml/ribbon" x:Class="WpfApp1.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm" xmlns:ViewModels="clr-namespace:WpfApp1.ViewModels"
mc:Ignorable="d"
DataContext="{dxmvvm:ViewModelSource Type=ViewModels:MainViewModel}"
d:DesignHeight="300" d:DesignWidth="800">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:OpenFileDialogService Title="{Binding Title}" />
<dxmvvm:SaveFileDialogService Title="{Binding Title}" />
</dxmvvm:Interaction.Behaviors>
<DockPanel>
<dxr:RibbonControl DockPanel.Dock="Top"
ShowApplicationButton="False"
ToolbarShowMode="Hide"
RibbonTitleBarVisibility="Collapsed">
<dxr:RibbonDefaultPageCategory Caption="Default Category">
<dxr:RibbonPage Caption="File">
<dxr:RibbonPageGroup Caption="Actions">
<dxb:BarButtonItem Content="Open"
Command="{Binding OpenCommand}"
Glyph="{dx:DXImage Image=Open_16x16.png}"
LargeGlyph="{dx:DXImage Image=Open2_32x32.png}"
RibbonStyle="Large" />
<dxb:BarButtonItem Content="Save"
Command="{Binding SaveCommand}"
Glyph="{dx:DXImage Image=Save_16x16.png}"
LargeGlyph="{dx:DXImage Image=Save_32x32.png}"
RibbonStyle="Large" />
</dxr:RibbonPageGroup>
<dxr:RibbonPageGroup Caption="Settings">
<dxb:BarEditItem Content="Title"
EditValue="{Binding Title}">
<dxb:BarEditItem.EditSettings>
<dxe:TextEditSettings />
</dxb:BarEditItem.EditSettings>
</dxb:BarEditItem>
<dxb:BarEditItem Content="Filter"
EditValue="{Binding Filter}">
<dxb:BarEditItem.EditSettings>
<dxe:TextEditSettings />
</dxb:BarEditItem.EditSettings>
</dxb:BarEditItem>
<dxb:BarEditItem Content="Filter Index"
EditValue="{Binding FilterIndex}">
<dxb:BarEditItem.EditSettings>
<dxe:TextEditSettings />
</dxb:BarEditItem.EditSettings>
</dxb:BarEditItem>
</dxr:RibbonPageGroup>
</dxr:RibbonPage>
</dxr:RibbonDefaultPageCategory>
</dxr:RibbonControl>
<dxr:RibbonStatusBarControl DockPanel.Dock="Bottom">
<dxr:RibbonStatusBarControl.RightItems>
<dxb:BarStaticItem Content="{Binding DialogResult}">
<dxb:BarStaticItem.ContentTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Dialog Result: " />
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</dxb:BarStaticItem.ContentTemplate>
</dxb:BarStaticItem>
</dxr:RibbonStatusBarControl.RightItems>
</dxr:RibbonStatusBarControl>
<TextBox Text="{Binding FileBody, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AcceptsReturn="True"
TextWrapping="Wrap" />
</DockPanel>
</UserControl>
对应模型视图:
using System;
using DevExpress.Mvvm.DataAnnotations;
using DevExpress.Mvvm;
using DevExpress.Mvvm.POCO;
using System.Linq;
using System.IO;
namespace WpfApp1.ViewModels
{
[POCOViewModel]
public class MainViewModel
{
#region Common properties
public virtual string Filter { get; set; }
public virtual int FilterIndex { get; set; }
public virtual string Title { get; set; }
public virtual bool DialogResult { get; protected set; }
public virtual string ResultFileName { get; protected set; }
public virtual string FileBody { get; set; }
#endregion
#region SaveFileDialogService specific properties
public virtual string DefaultExt { get; set; }
public virtual string DefaultFileName { get; set; }
public virtual bool OverwritePrompt { get; set; }
#endregion
protected ISaveFileDialogService SaveFileDialogService { get { return this.GetService<ISaveFileDialogService>(); } }
protected IOpenFileDialogService OpenFileDialogService { get { return this.GetService<IOpenFileDialogService>(); } }
public MainViewModel()
{
Filter = "Text Files (.txt)|*.txt|All Files (*.*)|*.*";
FilterIndex = 1;
Title = "Custom Dialog Title";
DefaultExt = "txt";
DefaultFileName = "Document1";
OverwritePrompt = true;
}
public void Open()
{
OpenFileDialogService.Filter = Filter;
OpenFileDialogService.FilterIndex = FilterIndex;
DialogResult = OpenFileDialogService.ShowDialog();
if (!DialogResult)
{
ResultFileName = string.Empty;
}
else
{
IFileInfo file = OpenFileDialogService.Files.First();
ResultFileName = file.Name;
using (var stream = file.OpenText())
{
FileBody = stream.ReadToEnd();
}
}
}
public void Save()
{
SaveFileDialogService.DefaultExt = DefaultExt;
SaveFileDialogService.DefaultFileName = DefaultFileName;
SaveFileDialogService.Filter = Filter;
SaveFileDialogService.FilterIndex = FilterIndex;
DialogResult = SaveFileDialogService.ShowDialog();
if (!DialogResult)
{
ResultFileName = string.Empty;
}
else
{
using (var stream = new StreamWriter(SaveFileDialogService.OpenFile()))
{
stream.Write(FileBody);
}
}
}
}
}
特别提醒,在Devexpress MVVM模式中。ModelView中的方法可在Model中直接以命令的形式绑定。比如OPEN,对应绑定的就是OpenCommmand,Debug,对应的就是DebugCommand.