我使用一个值转换器将标记的枚举绑定到一堆复选框,该转换器的工作方式与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)并正确绑定复选框,并将它们存储在目标字段中。但是,当我选中/取消选中另一个框时,目标字段默认为“无”,行为就像是从头开始。
任何帮助?
答案 0 :(得分:3)
“Converter”资源在哪里定义?在什么范围?如果您有一个项目列表,则必须在项目模板的范围内定义它,因为它需要单独维护每个项目的状态。
答案 1 :(得分:1)
我可能会离开这里,但可能是因为你的枚举将“Three”定义为3?
由于您使用按位运算符来选中和取消选中复选框,因此“三”值(0x11)将对应两者“一”和“两”值(分别为0x01和0x10) )。
我知道这似乎是违反直觉的,但请尝试将您的枚举声明更改为:
enum Numbers : int { One = 1, Two = 2, Three = 4, None = 0 };