What’s New in Infragistics WPF 15.2

Brian Lagunas / Tuesday, October 13, 2015

Infragistics WPF 15.2 is your release!  That’s right… your release.  My job as a Product Manager here at Infragistics is to give you, our customers, a voice.  I listen to your feedback, both positive and negative, and make sure our products reflect those conversations.  For years, Infragistics has been working on building a community with you, with honest and transparent communication.  It took some time, but you have finally discovered your voice.  You have been empowered by your voice.  Now, you have directly influenced the products you use with your voice.  Every single feature that we are delivering with our Infragistics WPF 15.2 release was requested and/or influenced directly by you.  We don’t have a single feature with any corporate strategy, agenda, or market influence.  This release is all about you, our customers.

Ask and thou shall receive! Let’s check out all the controls and features you ask for, and that we delivered in our 15.2 release.

xamBusyIndicator

Back in 2010, I started an OSS project called the Extended WPF Toolkit.  You may have hear of it.  The very first control in it was a busy indicator control.  Over the years, I added many more controls to the toolkit, but the busy indicator was always one of the most popular controls in the toolkit, and for good reason.  Every single WPF application I ever wrote had the need for a busy indicator control, and I am confident you have had a similar experience. Surprisingly, this is a control that has been missing from the Infragistics WPF offering for a long time.  Well, not anymore.  Thanks to you, we now have the best busy indicator control on the market.  Period.

For those of you that may not be familiar with a busy indicator control, it’s a control that makes it easy for a developer to report the progress of a long running, multi-threaded, process to their end-users.  It shows a dialog on top of an area of a view in which an animation will play to give the end-user visual feedback on the progress of an operation, while locking out the underlying view elements with a slightly transparent overlay.

xamBusyIndicator

Showing the xamBusyIndicator is as simple as setting the IsBusyproperty to true when a long running process is about to start.  To close it, set the IsBusy property back to false when the operation has completed.

The xamBusyIndicator supports both determinate and indeterminate states.  For indeterminate states, set the IsIndeterminate property to true, and a continuous animation will play until the operation has competed.  This is common for scenarios of when the time to complete an operation is unknown.  For determinate states, the developer can update the ProgressValueproperty in order to increment animation values to give the end-user visual feedback of the exact percentage complete of the operation.

The xamBusyIndicator ships with eight built-in animations (seven shown below) which can be changed using the Animationproperty.  Developers can also provide their own animation via a DataTemplate. Keep in mind that some animations only support the indeterminate mode regardless of the value of the IsIndeterminate property.

xamBusyIndicator animations

As with most busy indicator controls, the xamBusyIndicator also support the use of custom BusyContent, and the ability to delay the appearance of the indicator with the DisplayAfter property.  Another cool feature is the ability to set focus to any control in the view using the FocusAfterproperty, so when the xamBusyIndicator is closed, focus can be set on an element like a TextBox for a better end-user experience.

Another really cool thing we added for the xamBusyIndicator was actually to the WPF Sample Browser.  We added a cool configurator so that you can customize the xamBusyIndicator and then export the style for use in your application.  This way, you don’t have to write any code.  Just get the xamBusyIndicator just like you want it, export the style to the clipboard, and then paste into your application.  It’s that easy!

xamBusyIndicator configurator

xamDataGrid

Prior to 15.2, the xamDataGrid only provided the Excel style multi-select filtering option if the grid was using the FilterUIType of LabelIcons.  As you can imagine, that Excel style filtering is a very popular style of filtering, and we know how annoyed you were with this fitering option not being available with the FilterRecord option.  So we fixed it!  You can now provide this familiar Excel style filtering to your end users when using FilterRecord as the FilterUIType by setting the FilterOperandUIType to ExcelStyle.

xamDataGrid excel filtering

If you’re an MVVM developer, which if you are doing WPF you better be, then you are well aware of the INotifyDataErrorInfo interface.  Now, the INotifyDataErrorInfo interface is different than the IDataErrorInfo that is available in earlier versions of WPF.  INotifyDataErrorInfo was released with .NET 4.5 and is the new recommended interface to use for reporting error information both synchronously and asynchronously.  As you may have guessed by now, the xamDataGrid fully supports the INotifyDataErrorInfo interface.

Along those same lines, if you are doing MVVM, then you know all about the INotifyPropertyChanged interface.  But, what happens if your objects don’t implement INPC?  What can be done?  Well, there are a number of design patterns you could follow to add support for INPC.  Or, you can just use one of the two new methods we added to the xamDataGrids Record called RefreshCellValue and RefreshCellValues.  These new methods allow you to manually refresh the data that has been displayed to your users without the need for the INotifyPropertyChanged interface.

When we announced the release of the new TemplateField for the xamDataGrid, we had tons of great feedback and praise.  We also had a very common request.  As of the 15.2 release, you can now use a DataTempateSelector to utilize business logic to determine which template to apply for both the EditTemplate and DisplayTemplate.  Simply create a DataTemplateSelector class, add your logic, and then set the EditTemplateSelector and/or DisplayTemplateSelector properties.

The last feature we added to the xamDataGrid for 15.2 is a handy new event called DataSourceChanged.  This will allow you to respond any time the data source of the xamDataGrid has been changed.

xamPropertyGrid

For those customers wanting more control over the sorting of properties and categories in the xamPropertyGrid, wait no more.  We have introduced a number of new attributes and properties to the xamPropertyGrid to give you complete control over how the properties and categories are sorted.  For property sorting, simply decorate each property in a class with the PropertySortOrderAttribute and provide an integer to designate the desired order of the property.  For example; decorating a property with the following attribute would sort the property into the 5th position in the XamPropertyGrid display:

[PropertySortOrder(5)]

In order to set the sort order of categories, you need only to decorate the class with the CategorySortOrderAttributeand provide the name of the category to sort, as well as an integer to represent the desired order of the category as it will be shown in the xamPropertyGrid. You can declare multiple CategorySortOrderAttributes on a class to represent each category you have defined.  For example; the following attributes on a class would assign sort orders for 3 categories used by the properties in the class which would appear in the xamPropertyGrid in the order of “Touch”, “Behavior”, and “Appearance”:

[CategorySortOrder(“Appearance”, 5)]
[CategorySortOrder(“Behavior”, 4)]
[CategorySortOrder(“Touch”, 1)]

But Brian… what if my business object libraries can’t reference the Infragistics WPF assemblies?  Great question!  If the classes that contain the properties to be displayed in the XamPropertyGrid are contained in an assembly that doesn’t, or can’t, have a reference on the XamPropertyGrid and therefore doesn’t have access to the two custom attributes described above, we support an alternative approach where you can decorate your classes/properties with custom attributes that you define in your own assembly. The XamPropertyGrid will recognize these developer-defined custom sort attributes as long as they conform to the following 2 rules:

The developer defined attribute names must be:

  • CategorySortOrder (or CategorySortOrderAttribute)
  • PropertySortOrder (or PropertySortOrderAttribute)

And each must take parameters of the following types:

  • CategorySortOrder must take 2 parameters: one of type string for the category name and one of type int for the sort order
  • PropertySortOrder must take 1 parameter of type int for the sort order

But Brian… My objects are closed for modification, or I don’t have the access to modify the classes directly.  So I can’t even use my own custom attributes, even if I wanted to.  Now what?  No problem!  If you cannot, or prefer not to, take a declarative approach and decorate the types/properties with attributes, we provide a programmatic way for you to control the sort order. We do this by exposing two settable properties on the XamPropertyGrid of type IComparer:

  • public IComparerCategorySortComparer
  • public IComparer PropertySortComparer

Another feature asked for by customers was the ability to support the System.ComponentModel.MergablePropertyAttribute to give you control on how properties are edited when they exist on an object instance that is part of a multiple selection in the xamPropertyGrid.  When a property is decorated with the MergableProperty, the decorated property is hidden from the xamPropertyGrid and will not be available for editing.

Lastly, support for the System.ComponentModel.ICustomTypeDescriptor interface has been added to give you more control on how properties are displayed in the xamPropertyGrid by providing dynamic custom type information.

xamPropertyGrid ICustomTypeDescriptor support

xamComboEditor

The xamComboEditor now has support for the System.ComponentModel.DescriptionAttribute so that when binding the xamComboEditor to an items source that is an Enum, whether as a standalone editor or as an editor in the xamDataGrid, it will display the descriptions declared via the attribute rather than the actual Enum values.  This is one of those small, but very help and much needed features.

xamComboEditor DecriptionAttribute support

Legends

We made improvements to the API of the the Legend, ItemLegend, and ScaleLegend by exposing a number of new properties so that you can more easily change the appearance of the items that appear in the legends.

  • TitleForeground
  • TitleFontSize
  • TitleFontFamily
  • TitleFontStyle
  • TitleFontWeight
  • TitleFontStretch
  • ItemsForeground
  • ItemsFontSize
  • ItemsFontFamily
  • ItemsFontStyle
  • ItemsFontWeight
  • ItemsFontStretch

In addition, there are four new properties of positioning/aligning title and items within legends:

  • TitleHorizontalAlignment
  • TitleVerticalAlignment
  • ItemsHorizontalAlignment (not apply to ScaleLegend)
  • ItemsVerticalAlignment (not apply to ScaleLegend)

Note:  These new properties do not affect the legacy theme for the xamDataChart because the base class of the legend controls use different properties in this theme.

xamDataChart

New properties have been added to the xamDataChart that allows the developer to more easily set a major and minor gridline interval. This eliminates the need for you to create custom code to recompute the interval values each and every time the end-user zooms, scrolls, or when new data is added to the chart.

xamSpreadsheet

The xamSpreadsheet now has support for data validation.  You can now validate cell values, provide tooltips, and show error messages based on invalid values.

xamSpreadSheet data validation

Excel Engine

Our popular Excel engine, the engine that powers our xamSpreadsheet control, has added four new methods to its API.  These methods make it much easier to insert and delete rows and columns from the WorksheetTable class.

  • DeleteColumns(int tableColumnIndex, int count = 1)
  • DeleteDataRows(int dataRowIndex, int coun = 1)
  • InsertColumns(int tableColumnIndex, int count = 1)
  • InsertDataRows(int dataRowIndex, int coun = 1)

xamRichTextEditor

The xamRichTextEditor received a new method called GetPositionFromPointwhich enables a customer to get the nearest valid text insertion location relative to the supplied point. The method name and parameters match the name/parameters used by the WPF RichTextBox so that customers can easily discover this new method and be familiar with how it should work.

Let’s Wrap this Baby Up!

Besides the new xamBusyIndicator control, and all the new features I mentioned in this post, we are delivering much more that I didn’t get a chance to talk about.  We have tons of other smaller features, and bug fixes, and performance optimizations that are part of our newest 15.2 release.

I hope you are as excited about this release as I am.  As you have probably noticed, things are changing at Infragistics, and your voice is louder than ever.  If you have ideas about new features we should bring to our controls, important issues we need to fix, or even brand new controls you’d like us to introduce, please let us know by posting them on our Product Ideas website.  Follow and engage with us on Twitter via @infragistics. You can also follow and contact me directly on Twitter at @brianlagunas.  Also make sure to connect with our various teams via our Community Forumswhere you can interact with Infragistics engineers and other customers.

If you are not using our WPF controls yet, remember that a free evaluation download is only a click away.

Lastly, when you do build something cool with our controls, please make sure to let us know.