如果选中,则复选框绑定不会更改值

时间:2018-09-07 04:15:50

标签: c# wpf

我有一个数据库列userstatus,其中default为true。现在,我有一个复选框,允许用户选中它以禁用该用户。但是现在即使我选中了该复选框,用户状态在数据库中仍然显示为true。我该如何解决这个问题。

这是视图

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

这是视图背后的代码:

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 :(得分:1)

不要乱七八糟地进行转换,查看和查看模型。将模型保留在数据库中。如果数据库中的状态为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 injections

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

答案 1 :(得分:0)

我想您在代码隐藏中缺少逆子句。由于您未使用ViewModel的UserStatus,因此应将代码更新为

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

代替

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

答案 2 :(得分:0)

我认为您的问题是由于逻辑编码引起的:您总是通过!userstatus获得价值 让我们看看您当前的UserStatus代码:

private bool userstatus;


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

如果该复选框为true,并且用户单击该复选框,则您的setfunction会将userstatus的值设置为false。然后该复选框通过UserStatus属性获取其Value:“ return(userstatus == false)?true:false;”将是真实的价值。永远都是如此。

=>解决方案是更改您的UserStatus逻辑:

    private bool userstatus;


    public bool UserStatus
    {
        get { 
               return userstatus;
        }

        set
        {
            userstatus = value;
            OnPropertyChanged("UserStatus");
        }
    }