我有一个数据库列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");
}
}
答案 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");
}
}