首页 > 解决方案 > 如果选中为真,复选框绑定不会更改值

问题描述

我有一个默认为 true 的数据库列 userstatus。现在我有一个复选框,允许用户选中它以禁用用户。但是现在即使我选中了复选框,用户状态仍然在数据库中显示为 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");
        }
    }

标签: c#wpf

解决方案


不要把转换、视图和视图模型搞得一团糟。将模型保留在数据库中。如果数据库中的状态为 int,则将其保留为 int。通过转换器进行反转。使用来自视图模型的数据写入您的数据库。

制作逆布尔转换器:

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}}"/>

视图模型:

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

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

推荐阅读