private void DevicesView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var newlySelectedDevice = (Model.Device)(e.AddedItems.SingleOrDefault());

            DisconnectToDeviceButton.ClearValue(IsEnabledProperty);

            if (newlySelectedDevice == null)
            {
                //ConnectToDeviceButton.Visibility = Visibility.Collapsed;
                //DisconnectToDeviceButton.Visibility = Visibility.Collapsed;

                DisconnectToDeviceButton.IsEnabled = false;
                ConnectToDeviceButton.IsEnabled    = false;
                RemoveDeviceButton.IsEnabled       = false;
                EditDeviceButton.IsEnabled         = false;
                return;
            }

            ConnectToDeviceButton.Visibility    = Visibility.Visible;
            DisconnectToDeviceButton.Visibility = Visibility.Visible;

            ConnectToDeviceButton.IsEnabled    = !newlySelectedDevice.Connected;
            DisconnectToDeviceButton.IsEnabled = newlySelectedDevice.Connected;

            var newBinding = new Binding
            {
                Source = newlySelectedDevice,
                Path   = new PropertyPath("Connected"),
                Mode   = BindingMode.TwoWay
            };

            DisconnectToDeviceButton.SetBinding(IsEnabledProperty, newBinding);

            RemoveDeviceButton.IsEnabled = true;
            EditDeviceButton.IsEnabled   = true;
        }
        private async void ConnectToDeviceButton_Tapped(object sender, TappedRoutedEventArgs e)
        {
            var device = (Model.Device)DevicesView.SelectedItem;

            if (device == null)
            {
                return;
            }

            var terminals = Terminals.Instance;

            var destinationUri   = new Uri(device.Destination);
            var terminalInstance = terminals.Where(x => x.Connection.Destination.Equals(destinationUri)).SingleOrDefault();

            if (terminalInstance == null)
            {
                terminalInstance = new TerminalInstance();
                terminalInstance.PropertyChanged += TerminalInstance_PropertyChanged;

                terminals.Add(terminalInstance);
            }

            var username = string.Empty;
            var password = string.Empty;

            if (device.AuthenticationMethod == Model.EAuthenticationMethod.NoAuthentication)
            {
            }
            else if (device.AuthenticationMethod == Model.EAuthenticationMethod.UsernamePassword)
            {
                username = device.Username;
                password = await device.Password.Unprotect();
            }
            else
            {
                var authenticationProfile = Model.Context.Current.AuthenticationProfiles.Where(x => x.Id == device.AuthenticationProfileId).SingleOrDefault();
                if (authenticationProfile == null)
                {
                    System.Diagnostics.Debug.WriteLine("Failed to find an authentication profile");
                    return;
                }
                username = authenticationProfile.Username;
                password = await device.Password.Unprotect();
            }

            DisconnectToDeviceButton.ClearValue(IsEnabledProperty);

            var newBinding = new Binding
            {
                Source = device,
                Path   = new PropertyPath("Connected"),
                Mode   = BindingMode.TwoWay
            };

            DisconnectToDeviceButton.SetBinding(IsEnabledProperty, newBinding);

            if (!terminalInstance.ConnectTo(new Uri(device.Destination), username, password))
            {
                System.Diagnostics.Debug.WriteLine("Failed to connect to destination");
                return;
            }
        }