C# IValueConverter的绑定值重置为默认值
我已经使用一个值转换器将一个标记的枚举绑定到一组复选框,该值转换器的工作方式如解决方案中所述。当我使用一个没有设置为任何值的标志时,这很好 但是,在标志实际设置为某些数据的非平凡用例中,加载时复选框会正确绑定到枚举字段。但是,当我选中/取消选中该框时,似乎该绑定已丢失 例如,我的枚举和值转换器如下所示:C# IValueConverter的绑定值重置为默认值,c#,wpf,data-binding,checkbox,enums,C#,Wpf,Data Binding,Checkbox,Enums,我已经使用一个值转换器将一个标记的枚举绑定到一组复选框,该值转换器的工作方式如解决方案中所述。当我使用一个没有设置为任何值的标志时,这很好 但是,在标志实际设置为某些数据的非平凡用例中,加载时复选框会正确绑定到枚举字段。但是,当我选中/取消选中该框时,似乎该绑定已丢失 例如,我的枚举和值转换器如下所示: [Flags] enum Fruits : int { Apple = 1, Orange = 2, Peach = 4, None = 0 }; public Converter : IVa
[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;
}
}
<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>
我在datagrid中的XAML如下所示:
[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;
}
}
<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>
当我从对象加载绑定时,它会为列表中的每个项目执行Convert操作,并正确绑定复选框,并将它们存储在目标字段中。但是,当我选中/取消选中另一个框时,目标字段默认为“无”,行为就像从头开始一样
有什么帮助吗?我在这里可能不正确,但这可能是因为您的枚举将3定义为3吗 由于使用位运算符来选中和取消选中复选框,因此三个值0x11将分别对应于一个值0x01和两个值0x10 我知道这似乎违反直觉,但请尝试将您的枚举声明更改为:
enum Numbers : int { One = 1, Two = 2, Three = 4, None = 0 };
我可能在这里偏离了基准,但这可能是因为枚举将3定义为3吗 由于使用位运算符来选中和取消选中复选框,因此三个值0x11将分别对应于一个值0x01和两个值0x10 我知道这似乎违反直觉,但请尝试将您的枚举声明更改为:
enum Numbers : int { One = 1, Two = 2, Three = 4, None = 0 };
转换器资源在哪里定义?在什么范围内?如果您有项目列表,则必须在项目模板的范围内定义它,因为它需要单独维护每个项目的状态。转换器资源在哪里定义?在什么范围内?如果您有一个项目列表,则必须在项目模板的范围内定义它,因为它需要单独维护每个项目的状态。My bad。我重写了原始代码,因为我不想分享它。实际上有16个枚举,它们都是2的幂。对不起!我认为问题可能是由于某种原因,IValueConverter正在重新初始化。我怎么能检查这个呢?我无法想象它会是什么样子,但我想你可以创建一个无参数构造函数,并在其中设置一个断点来测试你的理论。我的错。我重写了原始代码,因为我不想分享它。实际上有16个枚举,它们都是2的幂。对不起!我认为问题可能是由于某种原因,IValueConverter正在重新初始化。我怎么能检查这个呢?我无法想象会是这样,但我想你可以创建一个无参数构造函数并在其中设置一个断点来测试你的理论。它是在DataGridTemplateColumn的DataTemplate.Resources部分中定义的。这是同一件事吗?我将用代码更新问题。我已经更新了代码。正如我所说的,绑定在第一次到第二次时确实有效。但是,一旦我关闭并重新启动应用程序并从数据库加载绑定,它会在加载时正确绑定它们,但之后似乎会丢失这些值。嗯。。。你知道吗,我忘记了模板的资源是否在实例之间共享,我现在没有时间测试。你能试着把转换器转移到资源中吗?真的很快???太好了,很高兴我们能找到答案!它在DataGridTemplateColumn的DataTemplate.Resources部分中定义。这是同一件事吗?我将用代码更新问题。我已经更新了代码。正如我所说的,绑定在第一次到第二次时确实有效。但是,一旦我关闭并重新启动应用程序并从数据库加载绑定,它会在加载时正确绑定它们,但之后似乎会丢失这些值。嗯。。。你知道吗,我忘记了模板的资源是否在实例之间共享,我现在没有时间测试。你能试着把转换器转移到资源中吗?真的很快???太好了,很高兴我们能找到答案!