【发布时间】:2013-03-12 09:14:17
【问题描述】:
如何使用 IValueConverter 将空值转换为布尔值?
我正在使用 wpf 来尝试显示一堆布尔值(在复选框中)。创建新记录时,这些值为空,并在复选框中显示为“不确定”。我希望空值出现并保存为“假”值。
我尝试创建一个 NullToBoolean 转换器,它从数据库中获取 null 值并将它们显示为 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。我已经尝试了所有Modes 并在使用 ConvertBack 进行转换时切换了代码,但似乎没有任何效果。
有人能指出我需要做什么来解决这个问题吗?
【问题讨论】:
-
长得丑的男人。您是否将 Null 转换为 false 并将 not-null 转换为 true?因为你没有那样做。在转换回来时,您将 bool(永远不会为空)转换回 bool。
-
您是否检查过您的转换器代码是否正常?
-
顺便说一句,“当创建新记录时,这些值为空......”是问题;解决这个问题。您应该制作“视图友好”的 ViewModels / DataModels。
-
@MeirionHughes 我认为您的评论会比我在回答中提出的更好的方法来解决这个问题。我认为您可以自己将其作为答案。
-
@MeirionHughes。不。Null 为 false,其他所有内容(始终为布尔值)为给定值。任何美化建议都很乐意接受:-)。评论 2)它们在数据库中可以为空(我无法更改)并且 EF 负责所有的创建。我想我可以使用 ValueConverter 创建一个视图友好的 ViewModel。对 Sandeep Singh Rawat:是的,我已经取出了我的 MessageBox/调试代码,但肯定是在使用方法。
标签: c# wpf null ivalueconverter