/// <summary/>
        public ApduSenderModel(ISmartCardUiProvider smartCardUiProvider, ISmartCardService smartCardService, ICommonDialogProvider commonDialogProvider)
        {
            this.smartCardUiProvider  = smartCardUiProvider;
            this.smartCardService     = smartCardService;
            this.commonDialogProvider = commonDialogProvider;

            this.unavailableStateAdapter = this.CreatePropertyAdapter(
                nameof(ApduSenderModel.UnavailableState),
                () => this.CardReader == null ? UnavailableState.NoCardReaderSelected :
                this.CardReader.SmartCard == null ? UnavailableState.NoSmartCardInReader : UnavailableState.Available
                );

            this.isAvailableAdapter = this.CreatePropertyAdapter(
                nameof(ApduSenderModel.IsAvailable),
                () => this.UnavailableState == UnavailableState.Available
                );

            this.smartCardAtrAdapter = this.CreatePropertyAdapter(
                nameof(this.SmartCardAtr),
                () => this.CardReader != null?
                this.CardReader.SmartCard != null?
                this.CardReader.SmartCard.Atr.ToHexString(" "):"":""
                );

            this.isSmartCardConnectedAdapter = this.CreatePropertyAdapter(
                nameof(ApduSenderModel.IsSmartCardConnected),
                () => this.CardReader != null ?
                this.CardReader.SmartCard != null ?
                this.CardReader.SmartCard.IsConnected :false : false
                );

            this.hasLastCommandAdapter = this.CreatePropertyAdapter(
                nameof(ApduSenderModel.HasLastCommand),
                () => this.LastCommand != null
                );

            this.SelectReaderCommand = new DelegateCommand(this.SelectReader);
            this.SendApduCommand     = new DelegateCommand(this.SendCommand, () => this.Command.CanConvertToByteArray() && this.Command.ToByteArray().Length >= 5 && this.IsSmartCardConnected);
            this.ConnectT0Command    = new DelegateCommand(() => this.Connect(Protocol.T0), () => this.IsSmartCardConnected == false);
            this.ConnectT1Command    = new DelegateCommand(() => this.Connect(Protocol.T1), () => this.IsSmartCardConnected == false);
            this.DisconnectCommand   = new DelegateCommand(this.Disconnect, () => this.IsSmartCardConnected);

            this.AddValidationForProperty(() => this.Command)
            .AddValidation(value => string.IsNullOrEmpty(value) == false, value => new ValidationMessage(ValidationSeverity.Info, "Please enter an APDU command to send"))
            .AddValidation(value => string.IsNullOrEmpty(value) || value.CanConvertToByteArray(), value => "Command is not a valid hexadecimal string")
            .AddValidation(value => string.IsNullOrEmpty(value) || value.CanConvertToByteArray() == false || value.ToByteArray().Length >= 5, value => "Command must be min 5 bytes in length.");
        }
 public ApduSenderModel(ISmartCardUiProvider smartCardUiProvider, WhileTrue.Modules.ModelInspector.IModelInspector modelInspector, ISmartCardService smartCardService, ICommonDialogProvider commonDialogProvider)
     : this(smartCardUiProvider, smartCardService, commonDialogProvider)
 {
     modelInspector.Inspect(this, "APDU Sender Model");
     this.smartCardService = smartCardService;
 }