IValueConverter的绑定值重置为默认值

时间:2009-11-01 05:22:56

标签: c# wpf data-binding checkbox enums

我使用一个值转换器将标记的枚举绑定到一堆复选框,该转换器的工作方式与this question的解决方案中描述的相同。当我使用尚未设置为任何内容的标志时,这可以正常工作。

但是,在非常重要的用例中,标志实际上设置为某些数据,在加载时,复选框正确绑定到枚举字段。但是,当我选中/取消选中该框时,似乎此绑定已丢失。

例如,我的枚举和值转换器如下:

[Flags]
enum Fruits : int { Apple = 1, Orange = 2, Peach = 4, None = 0 };

public Converter : IValueConverter
{
    private Fruits target;

    public Converter() { }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Fruits mask = (Fruits)parameter;
        this.target = (Fruits)value;
        return ((mask & this.target) != 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        this.target ^= (Fruits)parameter;
        return this.target;
    }
}

我的XAML(在数据网格中)如下:

<toolkit:DataGrid.Columns>
    <toolkit:DataGridTemplateColumn Header="Fruits">
        <toolkit:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <DataTemplate.Resources>
                    <ui:Converter x:Key="Converter" />
                </DataTemplate.Resources>
                <StackPanel>
                    <CheckBox Content="Apple" IsChecked="{Binding Path=Fruits, Converter={StaticResource Converter}, ConverterParameter={x:Static constants:Fruits.Apple}}" />
                    <CheckBox Content="Orange" IsChecked="{Binding Path=Fruits, Converter={StaticResource Converter}, ConverterParameter={x:Static constants:Fruits.Orange}}" />
                    <CheckBox Content="Peach" IsChecked="{Binding Path=Fruits, Converter={StaticResource Converter}, ConverterParameter={x:Static constants:Fruits.Peach}}" />
                </StackPanel>
            </DataTemplate>
        </toolkit:DataGridTemplateColumn.CellTemplate>
    </toolkit:DataGridTemplateColumn>
</toolkit:DataGrid.Columns>

当我从对象加载绑定时,它会通过转换为列表中的每个项目(ObservableCollection)并正确绑定复选框,并将它们存储在目标字段中。但是,当我选中/取消选中另一个框时,目标字段默认为“无”,行为就像是从头开始。

任何帮助?

2 个答案:

答案 0 :(得分:3)

“Converter”资源在哪里定义?在什么范围?如果您有一个项目列表,则必须在项目模板的范围内定义它,因为它需要单独维护每个项目的状态。

答案 1 :(得分:1)

我可能会离开这里,但可能是因为你的枚举将“Three”定义为3?

由于您使用按位运算符来选中和取消选中复选框,因此“三”值(0x11)将对应两者“一”和“两”值(分别为0x01和0x10) )。

我知道这似乎是违反直觉的,但请尝试将您的枚举声明更改为:

enum Numbers : int { One = 1, Two = 2, Three = 4, None = 0 };