mca*_*lex 8 c# wpf null ivalueconverter
如何使用IValueConverter将空值转换为布尔值?
我正在使用wpf来尝试显示一堆布尔值(在复选框中).创建新记录时,这些值为空,并在复选框中显示为"不确定".我希望空值出现并保存为"false"值.
我尝试创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图让Converter工作的复选框之一:
<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>
Run Code Online (Sandbox Code Playgroud)
我不知道问题是因为我的代码是错误的,还是因为转换器认为没有任何改变,因此它不需要ConvertBack.我已尝试Mode使用ConvertBack转换所有s和切换代码,但似乎没有任何效果.
有人能指出我需要做些什么来解决这个问题吗?
DHN*_*DHN 19
嗯,为什么使用转换器,如果你可以开箱即用?
<CheckBox IsChecked="{Binding VarianceDescriptionProvided, TargetNullValue=False}" />
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看此处.
真正的问题是您一开始就没有初始化数据对象。不要“修复”,而是从一开始就把事情做好;建筑商很好(例如)。您还应该制作 ViewModels/DataModels,而不是直接使用模型(数据库等)。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后总是用构建器初始化
myObjects.Add(new MyObjectBuilder().Build());
Run Code Online (Sandbox Code Playgroud)
或者
myObjects.Add(_injectedBuilder.Build()); // Initialises Checked to default
myObjects.Add(_injectedBuilder.WithChecked(true).Build()); //True
Run Code Online (Sandbox Code Playgroud)
虽然这不能解决您提出的问题,但它将以单元测试的方式解决您的根本问题。即您可以进行测试以确保添加到对象列表中的值始终被初始化。
| 归档时间: |
|
| 查看次数: |
7964 次 |
| 最近记录: |