最近使用wpf devexpress做一个wpf小项目,中间遇到了一些问题,这里记录下,同时也跟大家分享分享

1、devexpress安装

devexpress提供了很多控件,特别是各种形式的数据列表,做的又“花哨”,性能又好,很让人羡慕。

我安装的是20.1.3.0版本,安装完成后,devexpress会在编译器中添加项目模板和文件模板(VS又慢了不少)、

生成Demo Center ,Demo Source Code,从创建项目到控件的使用和demo源代码的查看,一条龙服务。

一、devexpress基础控件

devexpress提供了很多控件和实例项目,刚接触的时候,让人眼花缭乱啊。建议在使用前,把他们运行起来都看一遍,

这样在使用的时候能大概知道使用哪种类型的控件更合适。

二、Devexpress MVVM

1、ViewModelBese:ViewModelBese继承了BindableBase,BindableBase实现了INotifyPropertyChanged接口。

自定义绑定属性最简单的写法:

public string UserName
{
get { return GetValue<string>(); }
set { SetValue(value); }
} public ObservableCollection<ProductModel> ProductList
{
get { return GetValue<ObservableCollection<ProductModel>>(); }
set { SetValue(value); }
}

2、POCO ViewModel

已经有了个ViewModelBese为什么还需要POCO ViewModel呢?

这里的POCO是:Plain Old CLR Objects,官方给的解释,主要作用是简化你的ViewModel

POCO (Plain Old CLR Objects) View Models simplify and speed up the development process.

POCO View Models allow you to:

Define bindable properties as simple auto-implemented properties.

Create methods that function as commands at runtime.

Make properties and methods implement MVVM-specific interfaces.

This allows you to create clean, simple, maintainable, and testable MVVM code.

The POCO View Models are fully compatible with any WPF control.

You can use View Models Generated at Compile Time to generate boilerplate code for your ViewModels at compile time.

3、Messenger

跟MVVMlight的是Messenger使用差不多,但需要了解的是:

如果使用的是Messenger.Default.Register订阅消息,因为Messenger.Default是弱引用的信使,不会导致内存泄漏,因此不需要调用Messenger.Default.Unregister取消订阅

4、命令Commands

Xaml:

<Button Command="{Binding Path=TestCommand}" />

ViewModel:

public void Test(){}

public bool CanTest(){}

5、异步命令Asynchronous Commands

Xaml:

<dxlc:LayoutControl Orientation="Vertical" VerticalAlignment="Top">
<ProgressBar Minimum="0" Maximum="100" Value="{Binding Progress}" Height="20"/>
<Button Content="Calculate" Command="{Binding CalculateCommand}"/>
<Button Content="Cancel" Command="{Binding CalculateCommand.CancelCommand}"/>
</dxlc:LayoutControl>

ViewModel:

public AsyncCommand CalculateCommand { get; private set; }

async Task Calculate()
{
for(int i = 0; i <= 100; i++)
{
if(CalculateCommand.IsCancellationRequested)
{
Progress = 0;
return;
}
Progress = i;
await Task.Delay(20);
}
} int _Progress;
public int Progress
{
get { return _Progress; }
set { SetValue(ref _Progress, value); }
} public AsyncDelegateCommandsViewModel()
{
CalculateCommand = new AsyncCommand(Calculate);
}

6、消息框MessageBox

Xaml:

<dxmvvm:Interaction.Behaviors>
<dx:DXMessageBoxService x:Name="DXMessageBoxService" />
</dxmvvm:Interaction.Behaviors>

ViewModel:

IMessageBoxService MessageBoxService
{
get { return ServiceContainer.GetService<IMessageBoxService>(); }
}

使用:

MessageBoxService.ShowMessage("xxx!", "提示", MessageButton.OK, MessageIcon.Information);

7、线程管理服务DispatcherService

Xaml:

<dxmvvm:Interaction.Behaviors>
<dxmvvm:DispatcherService />
</dxmvvm:Interaction.Behaviors>

ViewModel:

IDispatcherService DispatcherService
{
get { return this.GetService<IDispatcherService>(); }
} //异步
DispatcherService.BeginInvoke( async ()=>
{
await Task.Delay(1000);
...
}); //同步
DispatcherService.Invoke(new Action(()=> { ... }));

8、导出服务Export

Service:

IExportService CustomerExportService
{
get { return GetService<IExportService>(); }
} public interface IExportService
{
void ExportToXls(string fileName);
} public class ExportService : ServiceBase, IExportService
{
public TableView View
{
get { return (TableView)GetValue(ViewProperty); }
set { SetValue(ViewProperty, value); }
} public static readonly DependencyProperty ViewProperty = DependencyProperty.Register("View", typeof(TableView), typeof(ExportService), new PropertyMetadata(null)); public void ExportToXls(string fileName)
{
if (View == null) return;
View.ExportToXls(fileName);
}
}

Xaml:

<dxmvvm:Interaction.Behaviors>
<services:ExportService View="{x:Reference View}" />
</dxmvvm:Interaction.Behaviors> <dxg:GridControl x:Name="GridControl"
dx:ScrollBarExtensions.ScrollBarMode="TouchOverlap"
AllowColumnMRUFilterList="False"
AutoExpandAllGroups="True"
DockPanel.Dock="Left"
ItemsSource="{Binding Path=Customers}"
SelectedItem="{Binding Path=SelectedCoustomer}"
ShowBorder="False">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:EventToCommand Command="{Binding UpdateCommand}" EventName="MouseDoubleClick" />
<dxmvvm:EventToCommand Command="{Binding SelectionChangedCommand}" EventName="SelectedItemChanged" />
</dxmvvm:Interaction.Behaviors>
<dxg:GridControl.GroupSummary>
<dxg:GridSummaryItem SummaryType="Count" />
</dxg:GridControl.GroupSummary>
<dxg:GridControl.Columns>
<dxg:GridColumn Width="1*"
Binding="{Binding Path=AutoId}"
FieldName="xxx" />
<dxg:GridColumn Width="3*"
Binding="{Binding Path=IssueTime}"
FieldName="日期">
<dxg:GridColumn.EditSettings>
<dxe:DateEditSettings Mask="G" MaskUseAsDisplayFormat="True" />
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
</dxg:GridControl.Columns>
<dxg:GridControl.TotalSummary>
<dxg:GridSummaryItem Alignment="Right" SummaryType="Count" />
<dxg:GridSummaryItem FieldName="FullName" SummaryType="Count" />
</dxg:GridControl.TotalSummary>
<dxg:GridControl.View>
<dxg:TableView x:Name="View"
AllowBestFit="True"
AllowCascadeUpdate="True"
AllowDragDrop="False"
AllowFixedGroups="True"
AllowPrintColumnHeaderImage="True"
AllowScrollAnimation="True"
BestFitMode="Smart"
HighlightItemOnHover="True"
NavigationStyle="Row"
ShowFixedTotalSummary="True"
UseLegacyFilterPanel="False" />
</dxg:GridControl.View>
</dxg:GridControl>

viewmodel:

CustomerExportService.ExportToXls(@"Files\customer.xls");

9、加载控件LoadingDecorator

Xaml:

<dx:LoadingDecorator IsSplashScreenShown="{Binding Path=IsLoading}"
OwnerLock="Full"
SplashScreenLocation="CenterWindow">
...
</dx:LoadingDecorator>

ViewModel:

public virtual bool IsLoading
{
get { return GetValue<bool>(nameof(IsLoading)); }
set { SetValue(value, nameof(IsLoading)); }
}

9、IOC容器Castle.Windsor

//集成Castle.Windsor
public class IocManager
{
private static IWindsorContainer _Instance;
private static readonly object syncRoot = new object(); private IocManager()
{
} public static IWindsorContainer Instance
{
get
{
lock (syncRoot)
{
if (_Instance == null)
{
_Instance = new WindsorContainer().Install(FromAssembly.This());
}
return _Instance;
}
}
}
} //注册(具体需要注册哪些实例,根据需要来定,这里举个例子)
IocManager.Instance.Register(
//view
Component.For<MainWindow>().LifestyleSingleton(), //viewmodel
Component.For<MainViewModel>().LifestyleSingleton(), //service
Component.For<ILoginService, LoginService>().LifestyleTransient()); //使用
MainWindow = IocManager.Instance.Resolve<MainWindow>();
MainWindow.ShowDialog();

10、集成log4net

首先需要配置好log4net,然后再结合Castle.Windsor的Logging Facility,将log4net注入到Castle.Windsor的容器中

注入:

IocManager.Instance.AddFacility<LoggingFacility>(p => p.LogUsing<Log4netFactory>().WithConfig("log4net.config"));

使用:

private ILogger logger = NullLogger.Instance;

public ILogger Logger
{
get { return logger; }
set { logger = value; }
} Logger.Info("Castle.Windsor Logging Facilityd的使用");

总的来说Devexpress设计的还是很友好的,使用起来比较顺畅。

Devexpress-WPF初体验的更多相关文章

  1. MEF 插件式开发 - WPF 初体验

    原文:MEF 插件式开发 - WPF 初体验 目录 MEF 在 WPF 中的简单应用 加载插件 获取元数据 依赖注入 总结 MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场 ...

  2. MEF 插件式开发之 WPF 初体验

    MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC .ASP WebForms.WPF ...

  3. MEF 插件式开发之 DotNetCore 初体验

    背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 甘特图、Data Editors控件新玩法—DevExpress WPF v19.2

    通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...

  6. DevExpress WPF v19.2图表图形控件功能增强?速速种草

    通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...

  7. New!Devexpress WPF各版本支持VS和SQL Server版本对应图

    点击获取DevExpress v19.2.3完整版试用下载 本文主要为大家介绍DevExpress WPF各大版本支持的VS版本和支持的.Net版本图,Devexpress WPF v19.2.3日前 ...

  8. WPF界面开发技巧大放送!DevExpress WPF在TreeListView中扩展N级

    DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...

  9. "xaml+cs"桌面客户端跨平台初体验

    "Xaml+C#"桌面客户端跨平台初体验 前言   随着 .Net 5的到来,微软在 .Net 跨平台路上又开始了一个更高的起点.回顾.Net Core近几年的成果,可谓是让.Ne ...

  10. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

随机推荐

  1. [Python] 可变/不可变类型 & 参数传递

    与c/c++不同,Python/Java中的变量都是引用类型,没有值类型 Python赋值语句由三部分构成,例如:   int   a  = 1 类型 标识 值 标识(identity):用于唯一标识 ...

  2. gdb调试多线程多进程

    多进程调试 我们使用gdb调试程序,gdb的调试默认是调试父进程的,如果要做到对父进程和子进程都做到调试,所以附加了调试子进程的功能. 设置条件 如果让gdb可以同时调试多个程序,只需要设置follo ...

  3. curl: (35) SSL connect error

    curl: (35) SSL connect error weixin_34212762 2018-02-23 20:16:23  230  收藏 文章标签: 运维 版权 阿里云的机器,昨晚githu ...

  4. 列表 元组 sort

    列表 增append insert extend 迭代增加删 remove delete pop clear改 li[索引]="被修改的内容":切片"" 列表 ...

  5. readlink 函数用法 -(转自 JK198310的专栏)

    相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:ssize_t readlink(const char *path, c ...

  6. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

  7. GO学习-(12) Go语言基础之函数

    Go语言基础之函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民 ...

  8. ML Pipelines管道

    ML Pipelines管道 In this section, we introduce the concept of ML Pipelines. ML Pipelines provide a uni ...

  9. 如何挑选深度学习 GPU?

    如何挑选深度学习 GPU? 深度学习是一个对计算有着大量需求的领域,从一定程度上来说,GPU的选择将从根本上决定深度学习的体验.因此,选择购买合适的GPU是一项非常重要的决策.那么2020年,如何选择 ...

  10. CentOS:操作系统级监控及常用计数器解析

    我相信有一些人看到这篇文章的标题肯定有种不想看的感觉,因为这样的内容实在被写得太多太多了.操作系统分析嘛,无非就是 CPU 使用率.I/O 使用率.内存使用率.网络使用率等各种使用率的描述. 然而因为 ...