当值为null或不为null时,如何检查列表视图中的复选框?

时间:2013-10-30 17:48:31

标签: c# wpf listview wpf-controls

我正在创建一个包含多个ListView的WPF GridViewColumn,并希望根据绑定将CheckBox IsChecked属性设置为true或false,以及是否该数据值为null或不为null。

我尝试使用下面的DataTrigger来完成此操作,但它似乎不起作用。它基本上保留了ListView中所有未选中的内容。

<GridViewColumn Header="W()" Width="20" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <CheckBox Content="Tell me something" >
                <CheckBox.Style>
                    <Style TargetType="{x:Type CheckBox}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding WebsiteJob}" Value="{x:Null}">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </CheckBox.Style>
            </CheckBox>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

根据绑定情况,我有办法在ListView GridViewColumn处理特定列吗?确实在这种情况下,我想为CheckBox提供一些自定义内容,并将其设置为IsChecked。我对WPF很新,所以很容易。

1 个答案:

答案 0 :(得分:0)

好的,这是我根据问题评论中的建议做的。我创建了一个存储原始对象的IValueConverter。这允许我对嵌套对象本身执行各种验证,然后在完成时将其设置回来。

public class CheckboxIsCheckedValueConverter : IValueConverter {

    public object OriginalValue;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value != null) {
            OriginalValue = value;
            return true;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        if ((bool)value == true) {
            return OriginalValue;
        } else {
            return null;
        }
    }
}

另外,我必须将xaml导入更改为以下内容。即使x:Shared在Intellisense中没有弹出,它仍然存在。这可以确保转换器的每个实例都是唯一的,并允许我存储原始值。

<l:CheckboxIsCheckedValueConverter x:Key="CheckboxIsCheckedValueConverter" x:Shared="False" />

修改了GridViewColumn

<GridViewColumn HeaderContainerStyle="{StaticResource SmokeStyleHeaders}" Header="W()" Width="30" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <CheckBox Foreground="White" Checked="CheckBox_Checked" IsChecked="{Binding WebsiteJob, Converter={StaticResource CheckboxIsCheckedValueConverter}}" Content="{Binding WebsiteJob, Converter={StaticResource WebsiteJobValueConverter}}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>