c# - 如果选中为真,复选框绑定不会更改值
问题描述
我有一个默认为 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");
}
}
解决方案
不要把转换、视图和视图模型搞得一团糟。将模型保留在数据库中。如果数据库中的状态为 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);
}
}
推荐阅读
- unity3d - 这是从复杂到复杂的 FFT 还是错误?
- android - 将 LiveData 数据绑定到 CustomView
- algorithm - 将文本消息拆分为 30 个字符的块,后缀为 (k/n)
- c# - 缺少 RelationalTypeMapping 实体框架核心
- javascript - 字符串到数字的转换无法在 javascript 中给出预期的结果
- javascript - 使用 for 循环和函数的 JavaScript 问题
- hyperledger - Composer 休息服务器实体太大
- swift - 为什么我的 UIImage 没有出现在我的 tabBar 中?
- npm - npm 命令行界面将版本号注入文件
- visual-studio - Visual Studio ftp 发布