Saving Grid (Dev Express) Layout with MVVM (code from DevExpress support), mvvmdevexpress
<Window x:Class="WPFGridTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys" 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:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" xmlns:local="clr-namespace:WPFGridTest" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <local:VM/> </Window.DataContext> <Window.Resources> <local:SaveRestoreCommands x:Key="saveRestoreLayoutCommands" Path="1.xml"/> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal"> <Button Content="Save" Command="{Binding Path=SaveLayoutCommand, Source={StaticResource saveRestoreLayoutCommands}}" CommandParameter="{Binding ElementName= g}"/> <Button Content="Restore" Command="{Binding Path=RestoreLayoutCommand, Source={StaticResource saveRestoreLayoutCommands}}" CommandParameter="{Binding ElementName=g}"/> </StackPanel> <dxg:GridControl x:Name="g" Grid.Row="1" ItemsSource="{Binding Source}"> <dxg:GridControl.View> <dxg:TableView x:Name="v"/> </dxg:GridControl.View> <dxg:GridControl.Columns> <dxg:GridColumn x:Name="c1" FieldName="ID"/> <dxg:GridColumn x:Name="c2" FieldName="Value"/> </dxg:GridControl.Columns> </dxg:GridControl> </Grid></Window>
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using DevExpress.Xpf.Grid;using DevExpress.Xpf.Core.Native;using DevExpress.Xpf.Bars;using System.ComponentModel;using System.Windows.Interactivity;using DevExpress.Xpf.Core;using System.ComponentModel.DataAnnotations;using System.Data;using System.Collections.ObjectModel;using DevExpress.Xpf.Editors;using DevExpress.Data;using DevExpress.Xpf.Editors.Settings;using DevExpress.Xpf.Core.Commands;using System.IO;namespace WPFGridTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class VM { public TestDataList Source { get; set; } public VM() { Source = TestDataList.Create(); } } public class TestDataList : ObservableCollection<TestDataItem> { public static TestDataList Create() { TestDataList res = new TestDataList(); TestDataItem item = new TestDataItem(); item.ID = 0; item.Value = "A"; res.Add(item); item = new TestDataItem(); item.ID = 1; item.Value = "b"; res.Add(item); item = new TestDataItem(); item.ID = 2; item.Value = "C"; res.Add(item); item = new TestDataItem(); item.ID = 3; item.Value = "C"; res.Add(item); return res; } } public class TestDataItem { public int ID { get; set; } public string Value { get; set; } } public class SaveRestoreLayoutCommandBase : ICommand { internal string Path { get; set; } public virtual bool CanExecute(object parameter) { if (string.IsNullOrEmpty(Path)) return false; return true; } public event EventHandler CanExecuteChanged; public virtual void Execute(object parameter) { if (!(parameter is GridControl)) throw new Exception(); } internal void RaiseCanExecuteChanged() { if (CanExecuteChanged != null) CanExecuteChanged(this, EventArgs.Empty); } } public class SaveLayoutCommand : SaveRestoreLayoutCommandBase { public event EventHandler Executed; public override void Execute(object parameter) { base.Execute(parameter); ((GridControl)parameter).SaveLayoutToXml(Path); if (Executed != null) Executed(this, EventArgs.Empty); } } public class RestoreLayoutCommand : SaveRestoreLayoutCommandBase { public override bool CanExecute(object parameter) { if (!base.CanExecute(parameter) || !File.Exists(Path)) return false; return true; } public override void Execute(object parameter) { base.Execute(parameter); ((GridControl)parameter).RestoreLayoutFromXml(Path); } } public class SaveRestoreCommands { string path; public string Path { get { return path; } set { path = value; SaveLayoutCommand.Path = path; RestoreLayoutCommand.Path = path; } } public SaveLayoutCommand SaveLayoutCommand { get; private set; } public RestoreLayoutCommand RestoreLayoutCommand { get; private set; } public SaveRestoreCommands() { SaveLayoutCommand = new SaveLayoutCommand() { Path = this.Path }; RestoreLayoutCommand = new RestoreLayoutCommand() { Path = this.Path }; SaveLayoutCommand.Executed +=new EventHandler(SaveLayoutCommand_Executed); } void SaveLayoutCommand_Executed(object sender, EventArgs e) { if (RestoreLayoutCommand != null) RestoreLayoutCommand.RaiseCanExecuteChanged(); } }}