【发布时间】:2014-07-14 15:51:10
【问题描述】:
我有一个 TaskStatus 到布尔转换器,它在 XAML 中为 Windows 应用商店应用程序(通用应用程序)实现了 IValueConverter 接口。
我有三个任务状态,我使用 IsThreeState="true" 在复选框中启用了不确定状态。
现在虽然 IsChecked 属性似乎是 Boolean?,但转换器始终将 System.Boolean 作为目标类型。无论我返回什么(例如 null)总是转换为 false,因此我无法在我的复选框中获得第三个状态。
有没有办法在我的转换器中指定 TargetType 或返回 null 以便 IsChecked 将 null 作为输入并因此显示第三个状态?
这是转换器:
public class TaskStatusToCheckBoxStateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var taskStatus = (TaskStatus) value;
switch (taskStatus)
{
case TaskStatus.Open:
return false;
case TaskStatus.InProgress:
return null;
case TaskStatus.Done:
return true;
default:
throw new ArgumentOutOfRangeException();
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
var checkBoxState = (Boolean?) value;
if (checkBoxState == null)
return TaskStatus.InProgress;
if (checkBoxState.Value)
return TaskStatus.Done;
return TaskStatus.Open;
}
}
复选框的 XAML 代码
<CheckBox x:Name="CheckBoxTaskState"
IsThreeState="True"
IsChecked="{Binding Status,
Converter={StaticResource TaskStatusToCheckBoxStateConverter},
Mode=TwoWay}">
</CheckBox>
【问题讨论】:
-
尝试返回
Nullable<Boolean>而不是 null。 (注意 Nullable 是一个结构体,它会被装箱为一个对象。因此,返回 null 与返回 Nullable 不同。) -
也不起作用。不幸的是同样的结果。或者也许我做错了。我现在有
return new Nullable<Boolean>();。这是你的意思吗? -
我刚刚检查了三态复选框和一个 System.Windows.Data.IValueConverter(手头没有 VS2013/WindowsStore 项目),其 Convert 方法返回null 或 new Nullable
。两种变体都像一个魅力。您是否尝试在 Convert 和 ConvertBack 方法中设置断点来观察绑定和转换器正在处理的具体值是什么? -
是的。我检查了那个。当值为 TaskStatus.InProgress 时,代码正确地进入适当的 switch case。目标类型始终为 System.Boolean。 ConvertBack 就像一个魅力。 Just Convert 不会返回正确的空值。我也在 WPF 应用程序中尝试了相同的方法,就像在您这边一样,它按预期工作(null 和 Nullable
)。 -
这很奇怪。我不相信 CheckBox 或与转换器的绑定在 WindowsStore 应用程序中被破坏。如果您看到 ConvertBack 正常工作而 Convert 似乎不起作用,我只能想到以下可能导致您的问题的情况:(1)代码中的某个地方-在 XAML 中的触发器定义之后或作为触发器定义的一部分,CheckBox 属性 IsChecked 或 IsThreeState 的值在某些情况下会发生更改。 (2) 您的代码有另一个双向数据绑定,其中 IsChecked 或 IsThreeState 属性作为其更改属性的绑定源。
标签: c# xaml checkbox windows-store-apps win-universal-app