Привязка флажка не изменяет значение, если установлено значение true - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть столбец базы данных userstatus, где по умолчанию установлено значение true. Теперь у меня есть флажок, который позволяет пользователю проверять его, чтобы отключить пользователя. Но теперь, даже когда я установил флажок, статус пользователя все еще показывает true в базе данных. Как я могу исправить эту проблему.

Вот это Вид :

<CheckBox x:Name="cbUserStatus" Content="Disable" IsChecked="{Binding UserStatus}"/>

Вот код, стоящий за View :

int userStatus = Convert.ToInt32(cbUserStatus.IsChecked.Value);



try
        {
            string query = "Update users set USER_FIRSTNAME = '" + firstName + "', USER_ROLE = '"+ userRole + "', USER_STATUS = '"+ userStatus +"' where ID = " + id;

            db.QueryCommand(query);

            MessageBox.Show("User updated successfully");
            this.Close();
            admin_home adminWindow = new admin_home();
            adminWindow.Show();

        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.ToString());
        }

Вот мой пользователь Модель :

 private bool userstatus;


    public bool UserStatus
    {
        get { return (userstatus == false) ? true : false; }
        set
        {
            userstatus = value;
            OnPropertyChanged("UserStatus");
        }
    }

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Полагаю, в вашем коде позади пропущено обратное предложение. Поскольку вы не используете UserStatus ViewModel, вы должны обновить свой код как

int userStatus = if( Convert.ToInt32(cbUserStatus.IsChecked.Value) == 0) ? 1 : 0 ;

Вместо

int userStatus = Convert.ToInt32(cbUserStatus.IsChecked.Value);
0 голосов
/ 07 сентября 2018

Я думаю, что ваша проблема из-за логического кодирования: вы всегда получаете значение от! Userstatus Позвольте увидеть ваш текущий код UserStatus:

private bool userstatus;


public bool UserStatus
{
    get { return (userstatus == false) ? true : false; }
    set
    {
        userstatus = value;
        OnPropertyChanged("UserStatus");
    }
}

Если флажок установлен в true и пользователь нажимает на флажок, тогда значение userstatus устанавливается в false с помощью функции set. И флажок получает его значение через свойство UserStatus: «return (userstatus == false)? True: false;» будет истинное значение. И это всегда будет правдой.

=> Решение - изменить логику UserStatus:

    private bool userstatus;


    public bool UserStatus
    {
        get { 
               return userstatus;
        }

        set
        {
            userstatus = value;
            OnPropertyChanged("UserStatus");
        }
    }
0 голосов
/ 07 сентября 2018

Не делайте беспорядок преобразования, просмотра и просмотра модели. Оставьте модель как есть в базе данных. Если в базе данных статус int, оставьте его как int. Делать инверсию через конвертер. Напишите в свою базу данных, используя данные из viewmodel.

Сделать обратный логический преобразователь:

public class InverseBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            bool testValue = System.Convert.ToBoolean(value);
            return !testValue; // or do whatever you need with this boolean
        }
        catch { return true; } // or false
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            int testValue = System.Convert.ToInt32(!((bool)value));
            return testValue; // or do whatever you need with this boolean
        }
        catch { return 1; } 
    }
}

Укажите конвертер:

<Window.Resources>
        <yourNS:InverseBooleanConverter x:Key="inverseIntBoolConverter"/>
...

<CheckBox x:Name="cbUserStatus" Content="Disable" IsChecked="{Binding UserStatus,Converter={StaticResource inverseIntBoolConverter}}"/>

ViewModel:

public int UserStatus
    {
        get { return userstatus; }
        set
        {
            if (value!=userstatus)
            {
               userstatus = value;
               OnPropertyChanged(nameof(UserStatus)); 
            } 
        }
    }

Пишите в свою базу данных из viewModel:

int userStatus = viewModel.UserStatus;

Использование параметров при построении запроса для предотвращения внедрения SQL :

var comm = connection.CreateCommand();
comm.CommandText = "Update users set USER_FIRSTNAME = @firstName , USER_ROLE = @userRole, USER_STATUS = @userStatus where ID = @id;"
comm.Parameters.Add("@firstName",firstName );
comm.Parameters.Add("@userRole", userRole);
comm.Parameters.Add("@userStatus", userStatus);
comm.Parameters.Add("@id", id);
comm.ExecuteNonQuery();

Код конвертера для состояния bool в ViewModel

    public class InverseBooleanConverter : IValueConverter
    {
      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
      {
         return !((bool)value);                
      }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
       return Convert(value, targetType, parameter, culture);
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...