Versionen im Vergleich

Schlüssel

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

Beschreibung

Mit dem Interface „IWmsActivitySetting“ kann der WMS-Benutzer geneau genau eine Einstellung hinterlegen. Verwenden Sie das Interface „IWmsActivitySetting“ z.B. zur Konfiguration von API-Verbindungen. Auch die [accantum] DMS Verbindungseinstellung nutzen dieses Interface.

Häufige Anwendungsfälle:

  • Angabe von API-Einstellungen (Url zu einem Dienst bzw. einer Rest-API)
  • Angabe von Authentifizierung-Daten (Benutzername und Passwort oder ein LIzenzschlüssel)


Panel
titleInhalt

Inhalt




Aufbau des Interface IWmsActivitySetting

Eigenschaft / MethodeBeschreibung
Identifier

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();
            //}
        }
    }
}