Null To Boolean IValueConverter not working
本文关键字:not working IValueConverter Boolean To Null | 更新日期: 2023-09-27 18:03:23
如何使用IValueConverter将空值转换为布尔值?
我正在使用wpf尝试显示一堆布尔值(在复选框中)。当创建新记录时,这些值为空,并在复选框中显示为"不确定"。我希望空出现并保存为"假"值。
我试图创建一个NullToBoolean转换器,从数据库中获取空值并将它们显示为false, 然后在用户点击保存时将它们保存为false。(从本质上讲,我试图避免用户必须在复选框中单击两次(一次使其为真,然后再次使其为假)。这似乎对导入工作-即空值显示为false -但除非我做两次点击舞蹈值不改变在数据库中,当我保存。
我的转换器:
[ValueConversion(typeof(bool), typeof(bool))]
public class NullBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
return value;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
return value;
}
return null;
}
}
我试图让转换器工作的复选框之一:
<CheckBox Grid.Column="1" Grid.Row="0" Padding="5" Margin="5" VerticalAlignment="Center" Name="chkVarianceDescriptionProvided" IsThreeState="False">
<CheckBox.IsChecked>
<Binding Path="VarianceDescriptionProvided" Mode="TwoWay">
<Binding.Converter>
<utils:NullBooleanConverter />
</Binding.Converter>
</Binding>
</CheckBox.IsChecked>
</CheckBox>
我不知道问题是否因为我的代码是错误的,或者如果它是转换器认为没有任何改变的情况,因此它不需要ConvertBack
。我已经尝试了所有的Mode
s和转换与ConvertBack切换代码,但似乎没有任何工作。
谁能指出我需要做什么来解决这个问题?
嗯,如果你可以开箱即用,为什么要使用转换器呢?
<CheckBox IsChecked="{Binding VarianceDescriptionProvided, TargetNullValue=False}" />
真正的问题是您没有首先初始化您的数据对象。不要"修理",要从一开始就把它做好;例如,构建器就很好。你还应该制作视图模型/数据模型,而不是直接使用你的模型(数据库等)。
public class MyObjectBuilder
{
Checked _checked;
public MyObjectBuilder()
{
Reset()
}
private void Reset()
{
_checked = new Checked(true); //etc
}
public MyObjectBuilder WithChecked(bool checked)
{
_checked = new Checked(checked);
}
public MyObject Build()
{
var built = new MyObject(){Checked = _checked;}
Reset();
return built;
}
}
则始终使用构建器
进行初始化myObjects.Add(new MyObjectBuilder().Build());
或
myObjects.Add(_injectedBuilder.Build()); // Initialises Checked to default
myObjects.Add(_injectedBuilder.WithChecked(true).Build()); //True
虽然这不能解决你所问的问题,但它将以单元测试的方式解决你的潜在问题。也就是说,你可以测试以确保添加到对象列表中的值总是被初始化。
只需在执行数据绑定之前纠正您的数据。这是唯一的选择。转换器只会使复选框显示为"未选中",并仅在与控件交互时更新数据。例如:
foreach (var item in items)
{
if (item.VarianceDescriptionProvided == null)
item.VarianceDescriptionProvided = false;
}