Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

Mit Hilfe von WMS-Einstellungen können Konfigurationen gespeichert werden, die Ihre Aktivitäten zur Ausführung benötigen. Das WMS bietet unterschiedliche Arten von Einstellungen. Einerseits Einstellungen, die global und bei einer Workflow-Definition hinterlegt werden (z.B. die [accantum] DMS Verbindungseinstellung) andererseits Einstellungen zu denen mehrere Einträge hinterlegt werden können (wie zum Beispiel die Datenbank Einstellungen)

Grundlegendes

  • Um meine Einstellung zur Verfügung zu stellen, muss ein passendes Interface implementiert werden (IWmsActivitySetting oder IWmsActivitySettingList) aus dem Namespace Accantum.Wms.ActivityContracts.Settings
  • Jede Einstellung benötigt einen eindeutigen Identifier vom Typ "Guid".
  • Für den Titel und Tool-Tip sollten wie im Designer lokalisierte Ressourcen verwendet werden.
  • Die Werte für die Einstellung müssen serialisiert werden, um sie als string in der WMS-Datenbank zu speichern
  • Jede Einstellung stellt ein Control zur Verfügung, in dem der Benutzer die Daten eintragen kann.

Tipps

  • In Bindings für Eingabefelder „UpdateSourceTrigger=PropertyChanged“ verwenden, damit die Daten im ViewModel sofort aktualisiert werden. Sonst kann es vorkommen, dass bei Klick auf den Speichern-Button die Daten nicht übernommen werden.
  • Initialisieren Sie das UserControl einmal in der Methode „Initialise“. Wie zeigen Beispiele weiter unten und in dem WmsActivitySample-Projekt
  • Tipp: Nutzen Sie in WPF-UserControl folgendes Attribut, damit Sie über IntelliSense auf das View-Model zugreifen können:
    d:DataContext="{d:DesignInstance s:WeatherApiSettingControlViewModel}

Details


Panel
titleInhalt

Inhalt



IWmsActivitySetting: Eine einfache Einstellung

Verwenden Sie das Interface „IWmsActivitySetting“ wenn Sie genau eine Einstellung für Ihre Aktiivtät(en) benötigen z.B. zur Konfiguration von API-Verbindungen.

Aufbau des Interface IWmsActivitySetting

Eigenschaft / MethodeBeschreibungIdentifier

Immer gleicher, eindeutiger Identifier dieser Einstellung!

TitleTitel der Einstellung, wird als Name des Menüs verwendet.TitleToolTipTooltip für das Menü bzw. die Schaltfläche.

Beispiel 

Implementierung IWmsActivitySetting

Codeblock
languagec#
titleBeispiel IWmsActivitySetting
linenumberstrue
collapsetrue
using System;
using System.ComponentModel;
using System.Windows.Controls;
using Accantum.Wms.ActivityContracts.Settings;

namespace HelloWorld.Settings
{
    public class HelloWorldSetting: IWmsActivitySetting
    {
        public HelloWorldSetting()
        {
        }

        public static Guid SettingUId = new Guid("2ee56307-e8b5-448e-90c4-476f01f3e5a2");

        public Guid Identifier => SettingUId;
        public string Title => Resources.HelloWorldSetting;
        public string TitleTooltip => Resources.HelloWorldSetting_Desc;

        public event PropertyChangedEventHandler PropertyChanged;

        public bool Initialise(string a_sSettings, bool a_bIsWorkflowDefSetting)
        {
            Content = new HelloWorldControl(a_sSettings);
            if (Content?.DataContext is HelloWorldControlViewModel oViewModel)
            {
                //PropertyChanged weiterleiten
                oViewModel.PropertyChanged += (a_oSender, a_oArgs) =>
                {
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(a_oArgs.PropertyName));
                };
            }

            return true;
        }

        public string GetSettings()
        {
            if (!(Content?.DataContext is HelloWorldControlViewModel oViewModel))
                return string.Empty;
            return oViewModel.GetSettings();
        }

        public void RestoreSettings(string a_sSettings)
        {
            if (Content?.DataContext is HelloWorldControlViewModeloViewModel oViewModel)
                oViewModel.RestoreSettings(a_sSettings);
        }

        public UserControl Content { get; private set; }
    }
}

Implementierung ViewModel 

Codeblock
languagec#
titleBeispiel Setting-ViewModel
linenumberstrue
collapsetrue
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace HelloWorld.Settings
{
    public class HelloWorldControlViewModel: INotifyPropertyChanged
    {
        private string m_sText;

        public HelloWorldControlViewModel(HelloWorldSetting a_sSetting)
        {	
        }

        public string Text { get; set; }

        public string GetSettings()
        {
            // return serialized setting
        }

        public void RestoreSettings(string a_sSettings)
        {
            // restore settings
        }

        private void SetSettings(HelloWorldSettingData a_oSettings)
        {
            Text = a_oSettings.Text
        }

		// Implementierung von INotfiyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Implementierung Oberfläche

Codeblock
languageyml
titleBeispiel Setting Control
linenumberstrue
collapsetrue
<UserControl x:Class="HelloWorldSetting.HelloWorldControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:properties="clr-namespace:HelloWorld.Properties"
             xmlns:mySetting="clr-namespace:HelloWorld.Settings"
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="400"
             d:DataContext="{d:DesignInstance {x:Type mySetting:HelloWorldControlViewModel}}">


    <Grid Margin="4" MaxWidth="500" HorizontalAlignment="Left">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*" MinWidth="300"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="{x:Static properties:Resource.Text}" Margin="4"/>
        <TextBox Grid.Row="0" Grid.Column="1" Margin="4" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>

        <!-- weitere Controls ...-->

    </Grid>
</UserControl>

Verwendung in der Aktivität

Codeblock
languagec#
titleBeispiel zur Verwendung in der Aktivität
linenumberstrue
collapsetrue
using System;
using System.Activities;
using System.ComponentModel;
using System.Drawing;
using Accantum.Wms.ActivityContracts.Attributes;
using Accantum.Wms.ActivityContracts.Settings;
using ActivitySample.Activities.ActivityWithSetting.MySetting;
using ActivitySample.Images;

namespace ActivitySample.Activities.ActivityWithSetting.V01
{
    /// <summary>
    ///  Diese Aktivität verwendet die Einstellung <see cref="HelloWorldSetting"/>, um z.B. auf einen externen Dienst zuzugreifen.
    ///  Attribut mit der Implementierung von <see cref="IWmsActivitySetting"/> ist nötig, um die Einstellung im Workflow-Studio anzeigen
    /// </summary>
    [ActivityGroup("Acc-Demo")]
    [ActivitySettingsType(typeof(HelloWorldSetting))]
    public class ActivityWithSetting : CodeActivity
    {

        /// <summary>
        /// Aktivität gibt zu Testzwecken den Text aus den Einstellungen zurück
        /// </summary>
        public OutArgument<string> Text{ get; set; }


        protected override void Execute(CodeActivityContext a_oContext)
        {
            //Einstellung aus dem ActivityContext ermitteln, dazu ist der Identifier des Settings notwendig
            WmsSettingsCollection oExtension = a_oContext.GetExtension<WmsSettingsCollection>();
            WmsSettingValue oSettingValue = oExtension[HelloWorldSetting.SettingId];

            //Den serialisierte Wert der Einstellung deserialisieren
            var oMySetting = MySettingData.Deserialise(oSettingValue.SerializedValue);
            if (oMySetting == null)
                throw new Exception("Einstellung ist nicht vorhanden!");
            Console.Out.WriteLine("Einstellung: " + oSettingValue.SerializedValue);

            Text.Set(a_oContext, oMySetting.Text);

            //So könnte ein Aufruf eines Dienst aussehen (MyServiceAdapter sollte Disposable sein)
            //using (var oServiceAdapter = new MyServiceAdapter(oMySetting, a_oContext))
            //{
            //    oServiceAdapter.DoSomething();
            //}
        }
    }
}

IWmsActivitySettingList: Einstellung mit mehreren Einträgen

Aufbau des Interface IWmsActivitySettingList

Eigenschaft / MethodeBeschreibungIdentifier

Immer gleicher, eindeutiger Identifier dieser Einstellung!

TitleTitel der Einstellung, wird als Name des Menüs verwendet.TitleToolTipTooltip für das Menü bzw. die Schaltfläche.DialogContent

UserControl zur Bearbeitung der Einstellung im Dialog.
Erst in InitialiseDialog-Methoden zusammen bauen!

IsValidDialogData()Prüft, ob die Eingaben im Dialog valide sind. Nur dann wird der Dialog geschlossen.

AddErrorToDialog(string error)

Zeigt eine Fehlermeldung im Dialog an.

InitialiseDialogData(WmsSettingEntry entry)Erzeugt die Oberfläche zur Bearbeitung eines Eintrages.GetDialogData()Ermittelt die Eingaben aus dem Dialog um sie zu speichern.

→ Siehe WMS Einstellung: IWmsActivitySetting



IWmsActivitySettingList: Einstellung mit mehreren Einträgen

Verwenden Sie das Interface „IWmsActivitySettingList“ wenn Sie im Workflow aus mehreren Einstellugnen wählen müssen.

→ Siehe WMS Einstellung: IWmsActivitySettingList



IWmsActivitySettingWithMapping: Einstellung mit eigenen Zuordnungen

Verwenden Sie das Interface „IWmsActivitySettingWithMappingt“ (zusammen mit IWmsActivitySetting!), wenn Sie im Workflow Zuordnungen zu Objekten aus einem Drittsystem benötigen.

→ Siehe  WMS Einstellung: IWmsActivitySettingWithMapping