v26.1 plugin updates
The goal of this document is to outline the changes that are required to update an HH DM plugin from v25.1 to v26.1.
Please note that not all changes may apply to all plugins.
Preview version
To make it easier to migrate the plugin a preview version of HH Data Management v26.1 has been made available. Due to the software needing to download a data migration from the server before being able to function this version is not runnable, it can only be used to build the plugin. This release contains only minor breaking changes and therefore we believe that this should be sufficient for plugins to be updated.
Downloading and running the client
If you do not have access to this version, please let us know and it will be added to your account. The preview version is available on the Other → Releases page of the website:

The version can also be downloaded directly using this link: https://hh-dev.com/latest/HHDM-v26.1
Please note that this version is portable, meaning that it doesn't need to be installed. Unzip the downloaded directory and run the file HHDev.DataManagement.Client.HHDataManagement.exe.
Plugin settings update
To make sure the references are linked to the right version of HH DM, you will need to put the path of the HH DM 26.1 preview version in the project file of the plugin:

Example plugin
Please see https://github.com/hh-development/HHDev.HHDM.DesktopPlugin/compare/master...release/2025-major for an example commit of a simple plugin being updated.
Breaking changes
csproject files
The .net framework was changed from 7.0 to 9.0 and the DevExpress version was changed from v23.2 to v24.2. Also in most of the plugins we are using now the following features:
There are 3 files added to the plugin:
- Directory.build.props: It contains settings that should apply to all projects in the plugin repository. Like the version of DevExpress and also the .net framework version
- Directory.packages.props: It contains the version number for the nuget packages that are used in the plugin. Some plugins are built of multiple projects and this file ensures that all projects are using the same version. When you make changes in the nuget package manage now these changes will get written in this file instead of in the csproj fie.
- nuget.config: This file controls which nuget package gets downloaded from which package source. This is required when using the Directory.package.props file.
PluginInfo.json
The TargetVersionNumber needs to be changed to "26.1". Make sure the TargetVersionNumber is added to the PluginInfo.json, if it doesn't exist yet.
Interface changes
IBasicEntityFlatModel
Every class that directly implements the interface IBasicEntityFlatModel in your plugin should get rewritten to instead inherit from BasicEntityDetachedFlatModel. This is a base class that implement IBasicEntityFlatModel and that is fully customizable, as nearly all methods are virtual. Like this all the not needed code to implement IBasicEntityFlatModel is not needed anymore and changes to the IBasicEntityFlatModel interface don't require updates in the plugin anymore.
IHHObservableCollection<T>
We had a couple of variations of IHHObservableCollection<T> like IHHUnsortedObservableCollection<T> and IViewedHHObservableCollection<TKey, T>. These interfaces are still existing, but we added a new interface that is now exposed in the majority of the cases which is IReadOnlyHHObservableCollection<T>. Every public facing collection in caches now returns an IReadOnlyHHObservableCollection or IReadOnlyViewedHHObservableCollection, this is fine for most use cases, but if the original return type is still needed you can just cast it (the internal type did not change). There were two reasons to do that. One is that we wanted to prevent people from adding/removing items from the lists (for example when adding/deleting a setup), while the correct way to do this is to call the respective add/delete functions of the caches. And additionally we are now able to make changes to the underlying collections and more derived interfaces without breaking anything in the plugins.
API changes
DisplayQuantity
Removed:
HHDev.Core.NETStandard.Helpers.DisplayQuantity.ConvertUnit(eDimension dimension, string fromUnit, double? fromValue, string toUnit)
Replacement:
HHDev.Core.NETStandard.Helpers.DisplayQuantity.ConvertToUnit(eDimension dimension, double? value, string newUnit, string previousUnit)
Note that the order of the arguments has changed, so it's not enough to just change the name of the api.
Attached Files
In the AttachedFileView and in the AttachedFileCacheHelpers we used a boolean to control if a file should get automatically downloaded once it's uploaded and if it should get deleted locally, after it's uploaded. The respective apis have changed to now accept an enum of type eAutoDownloadMode instead. In cases where the boolean true was used before now eAutoDownloadMode.Yes should get used, and where falsewas used it's now eAutoDownloadMode.No. There is a third mode eAutoDownloadMode.FromParameter which takes the value that is defined in the attached file parameter, which is a new feature in v26.1.
Additionally an obsolete api was removed:
HHDev.DataManagement.Client.Wpf.Components.AttachedFiles.AttachedFileHelpers.GetPathOfAttachedFile(AttachedFileFlatModel)
Replacement:
HHDev.DataManagement.Client.Core.Components.AttachedFiles.AttachedFileFlatModel.FilePath
Logging
NLog was updated from v4 to v5, which made the way how we defined the logger in classes obsolete.
Old:
private static readonly ExtendedLogger _logger = (ExtendedLogger)LogManager.GetCurrentClassLogger(typeof(ExtendedLogger))
private static readonly MetricsLogger _metrics = (MetricsLogger)LogManager.GetLogger("MetricsLogger", typeof(MetricsLogger))
New:
private static readonly ExtendedLogger _logger = LogManager.LogFactory.GetCurrentClassLogger<ExtendedLogger>()
private static readonly MetricsLogger _metrics = LogManager.LogFactory.GetLogger<MetricsLogger>("MetricsLogger")
Interpolate
A typo was corrected.
Old:
HHDev.DataManagement.Client.Core.Helpers.LinearInterpolationHelpers.GetPrevisousAndNextItem(IEnumerable<double?> data, double? value, bool extrap)
New:
HHDev.DataManagement.Client.Core.Helpers.LinearInterpolationHelpers.GetPreviousAndNextItem(IEnumerable<double?> data, double? value, bool extrap)
Tyre Pressure Calculations
A couple of apis related to tyre pressure calculations have changed. Before there were four cold pressures, a reference temperature for the cold pressures, four hot pressures and two reference temperatures for the hot pressures passed in. Now this has changed to four cold pressures, four hot pressures, four reference temperatures for the cold pressures (one for each corner) and two reference temperatures for the hot pressures.

To keep the calculation as it was before, just correct the order of the inputs and pass in the value that used the be referenceTemperature four times now.
In AddBulkTyreSetPressureAdjustmentWindow now an additional parameter of type bool has to get passed in to define if it should show one or four inputs for the referenceTemperature(s).
Additionally the following properties changed:
ReferencePressureRunData:
- removed: SetAirTemperature
- added: FLAirTemperature, FRAirTemperature, RLAirTemperature, RRAirTemperature
TyreSetPressureAdjustmentModel and AddBulkTyreSetPressureAdjustmentViewModel:
- removed: ReferenceTemperature
- added: FLRefTemp, FRRefTemp, RLRefTemp, RRRefTemp
(Wpf)EditSetupSheetViewModel
Removed:
HHDev.DataManagement.Client.Wpf.ViewModels.Engineering.WpfEditSetupSheetViewModel.cs
Replacement:
HHDev.DataManagement.Client.Core.ViewModels.EditSetupSheetViewModel
CID Controls
There are some changes related to the binding in the CID. If you are binding a CID to a flat model then the binding can be done directly now. There is no converter needed and the converters have been removed from the code (as they were causing memory leaks). See for example the setups page in HH DM:

Theme resources
Accessing theme resources has changed.
XAML
Old:
{dxi:ThemeResource {dxt:PaletteBrushThemeKey ResourceKey=Brush.Foreground}}
New:
xmlns:extensions="clr-namespace:HHDev.Core.WPF.Extensions;assembly=HHDev.Core.WPF"
{extensions:HHThemeBrush ThemeKey=Foreground}
Code
New:
HHDev.DataManagement.Client.Wpf.Helpers.ThemeHelpers.GetThemeColor(HHDev.Core.WPF.Extensions.eThemeKey)