有没有办法暂时分离WPF中的绑定?

时间:2009-08-31 00:06:50

标签: wpf data-binding xaml binding

背景

我有一个ListView / GridView,其中有几列。在某些情况下,只显示一些列。由于WPF中Visible没有GridViewColumns属性,因此我将要隐藏的列的宽度设置为零。在视觉上,这实现了预期的效果(我实际上修改了ControlTemplate的{​​{1}},这样用户就不可能意外地扩展任何隐藏的列。)

问题:

问题是隐藏列的绑定仍在使用中,他们正在尝试查找不存在的数据。在这种情况下,它会导致GridViewColumnHeader,因为它正在尝试查找它所绑定的IndexOutOfRangeException上不存在的列名。

问题:

如何暂时禁用或分离隐藏列的绑定?或者如果你有一个更好的解决方案,请提出建议。

谢谢!

1 个答案:

答案 0 :(得分:2)

啊,我想我已经明白了。 IValueConverter救援。

这是我提出的解决方案,以防其他人遇到同样的问题:

步骤1.创建转换器。

IValueConverter检查索引是否超出范围,如果是,则返回空字符串。请注意,我使用转换器的parameter来保存列名称。

public class DataRowViewToCellString : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DataRowView row = (DataRowView)value;
        string columnName = (string)parameter;
        if (row.DataView.Table.Columns.Contains(columnName))
            return row[columnName].ToString();
        else
            return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

步骤2.将转换器转换为DataTemplate

<local_converters:DataRowViewToCellString
    x:Key="TaskWindow_DataRowViewToCellString" />

<DataTemplate
    x:Key="TaskWindow_Column4Template">
    <TextBlock
        Text="{Binding Converter={StaticResource TaskWindow_DataRowViewToCellString}, ConverterParameter=Column4}" />
</DataTemplate>

步骤3.在“有时隐藏的”GridViewColumn中引用模板。

<ListView ... >
    <ListView.View>
        <GridView ... >
            ...
            <GridViewColumn
                Header="SometimesHiddenColumn"
                CellTemplate="{StaticResource TaskWindow_Column4Template}">
        </GridView>
    </ListView.View>
</ListView>

修改

根据Dennis Roche的建议,在列名超出string.Empty到Binding.DoNothing的情况下,更改转换器的返回值。