翻译|使用教程|编辑:龚雪|2021-02-18 09:39:54.870|阅读 174 次
概述:DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序,本文将为大家介绍如何绑定到条件格式规则的集合。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
下载DevExpress v20.2完整版 DevExpress v20.2汉化资源获取
DevExpress WPF 拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。
使用模型视图ViewModel(MVVM)架构模型设计WPF应用程序时,可能需要在模型或视图模型中描述条件格式设置规则。 网格可以绑定到包含条件格式化规则的对象集合,这些条件在Model或ViewModel中进行了描述,从而最大限度地减少了“隐藏代码”的需求。
本文中使用的示例包含一个视图模型代码,其中包括以下类。
C#
using System.Collections.Generic; using System.Windows; using System.Windows.Controls; namespace GridDemo { // ... public class ViewModel { public ViewModel() { Orders = GetOrders(); Rules = GetFormattingRules(); } private static List<FormattingRule> GetFormattingRules() { var rules = new List<FormattingRule>(); rules.Add(new FormattingRule() { Expression = "([UnitPrice] * [Quantity] * (1 - [Discount]) - [Freight]) < 0", ApplyToRow = true, Type = FormattingType.Background }); rules.Add(new FormattingRule() { FieldName = "Discount", Expression = "[Discount] > 0", ApplyToRow = false, Type = FormattingType.Font }); rules.Add(new FormattingRule() { FieldName = "Discount", Expression = "[Discount] > 0", Type = FormattingType.Icon }); return rules; } private static List<Order> GetOrders() { List<Order> list = new List<Order>(); list.Add(new Order() { City = "Aachen", UnitPrice = 10, Quantity = 20, Discount = 0, Freight = 30.54 }); // ... return list; } // A list of orders displayed within the grid control. public List<Order> Orders { get; private set; } // A list of conditional formatting rules. public List<FormattingRule> Rules { get; private set; } } // Corresponds to an order items displayed within grid. public class Order { public string City { get; set; } public double Discount { get; set; } public double Freight { get; set; } public double Quantity { get; set; } public double UnitPrice { get; set; } } public enum FormattingType { Icon, Font, Background } public class FormattingRule { public virtual bool ApplyToRow { get; set; } public virtual string Expression { get; set; } public virtual string FieldName { get; set; } public virtual FormattingType Type { get; set; } } }
注意:如果在将格式条件集合分配给网格控件之后可能对其进行了更改,则它应实现INotifyCollectionChanged,以便网格中可以自动反映在视图模型内进行的更改。
基于条件格式模板生成条件格式。 创建多个模板,每种条件格式类型一个模板。 使用单个模板,您可以在无限数量的网格控件中创建无限数量的条件格式。 在此示例中,存在三种条件格式模板:FontFormat、BackgroundFormat和IconFormat。
为避免绑定到列属性时的性能问题,请使用dxci:DependencyObjectExtensions.DataContext附加属性。 请参见下面的示例。
XAML
<!----> xmlns:dxci="//schemas.devexpress.com/winfx/2008/xaml/core/internal" <!----> <DataTemplate x:Key="FontFormat"> <ContentControl> <dxg:FormatCondition ApplyToRow="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).ApplyToRow, RelativeSource={RelativeSource Self}}" Expression="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).Expression, RelativeSource={RelativeSource Self}}" FieldName="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"> <dxg:FormatCondition.Format> <dx:Format FontWeight="Bold" /> </dxg:FormatCondition.Format> </dxg:FormatCondition> </ContentControl> </DataTemplate>
要根据列的类型选择所需的模板,请使用模板选择器。 在此示例中,模板选择器由FormatConditionSelector类表示。
XAML
<Window x:Class="GridDemo.MainWindow" xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" xmlns:d="//schemas.microsoft.com/expression/blend/2008" xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:GridDemo" xmlns:dxg="//schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:dx="//schemas.devexpress.com/winfx/2008/xaml/core" xmlns:dxci="//schemas.devexpress.com/winfx/2008/xaml/core/internal" xmlns:dxt="//schemas.devexpress.com/winfx/2008/xaml/core/themekeys" Height="350" Width="525" mc:Ignorable="d" Title="MainWindow"> <Window.DataContext> <local:ViewModel /> </Window.DataContext> <Grid> <Grid.Resources> <DataTemplate x:Key="FontFormat"> <ContentControl> <dxg:FormatCondition ApplyToRow="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).ApplyToRow, RelativeSource={RelativeSource Self}}" Expression="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).Expression, RelativeSource={RelativeSource Self}}" FieldName="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"> <dxg:FormatCondition.Format> <dx:Format FontWeight="Bold" /> </dxg:FormatCondition.Format> </dxg:FormatCondition> </ContentControl> </DataTemplate> <DataTemplate x:Key="BackgroundFormat"> <ContentControl> <dxg:FormatCondition ApplyToRow="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).ApplyToRow, RelativeSource={RelativeSource Self}}" Expression="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).Expression, RelativeSource={RelativeSource Self}}" FieldName="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"> <dxg:FormatCondition.Format> <dx:Format Background="LightPink" /> </dxg:FormatCondition.Format> </dxg:FormatCondition> </ContentControl> </DataTemplate> <DataTemplate x:Key="IconFormat"> <ContentControl> <dxg:FormatCondition ApplyToRow="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).ApplyToRow, RelativeSource={RelativeSource Self}}" Expression="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).Expression, RelativeSource={RelativeSource Self}}" FieldName="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"> <dxg:FormatCondition.Format> <dx:Format Icon="{dx:IconSet Name=Stars3_1}" /> </dxg:FormatCondition.Format> </dxg:FormatCondition> </ContentControl> </DataTemplate> <local:FormatConditionSelector x:Key="selector" BackgroundTemplate="{StaticResource BackgroundFormat}" FontTemplate="{StaticResource FontFormat}" IconTemplate="{StaticResource IconFormat}" /> </Grid.Resources> </Grid> </Window>
C#
public class FormatConditionSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { if(!(item is FormattingRule)) return null; var vm = item as FormattingRule; switch(vm.Type) { case FormattingType.Icon: return IconTemplate; case FormattingType.Font: return FontTemplate; case FormattingType.Background: return BackgroundTemplate; default: return null; } } public DataTemplate BackgroundTemplate { get; set; } public DataTemplate FontTemplate { get; set; } public DataTemplate IconTemplate { get; set; } }
注意:如果可以使用单个模板描述所有条件格式,则无需创建模板选择器。 而是,将此模板分配给网格视图的 (的)属性。
最后,指定网格视图的FormatConditionGeneratorTemplateSelector和FormatConditionsSource属性。()属性指定网格生成条件格式的来源, () 属性指定模板选择器,该选择器根据其类型为每种条件格式返回一个模板。
XAML
<dxg:GridControl AutoGenerateColumns="AddNew" EnableSmartColumnsGeneration="True" ItemsSource="{Binding Orders}"> <dxg:GridControl.View> <dxg:TableView FormatConditionGeneratorTemplateSelector="{StaticResource selector}" FormatConditionsSource="{Binding Rules}" /> </dxg:GridControl.View> </dxg:GridControl>
下图显示了结果。
DevExpress技术交流群3:700924826 欢迎一起进群讨论
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@capbkgr.cn
文章转载自:慧都网