C#里IValueConverter里的两个方法调用顺序讲解

weikeli19 2019-03-21 02:44:33
我们都知道IValueConverter里有两个方法,那么何时调用ConvertBack这个方法是个关键问题 ,当然可以在代码中手动调用,但一般情况下是自动调用,比如在WPF应用程序里,那么现在回正题,什么时候调用ConvertBack这个方法,我用XAML来讲解,比如XAML中有一段代码是这样的:
<RadioButton Content="Dumb" HorizontalAlignment="Left" Margin="37,41,0,0" VerticalAlignment="Top" Name="dumbAIRadioButton" IsChecked="{Binding Path=ComputerSkill,Converter={StaticResource skillConverter},ConverterParameter=Dumb}"/>
<RadioButton Content="Good" HorizontalAlignment="Left" Margin="37,62,0,0" VerticalAlignment="Top" Name="goodAIRadioButton" IsChecked="{Binding Path=ComputerSkill,Converter={StaticResource skillConverter},ConverterParameter=Good}"/>
<RadioButton Content="Cheats" HorizontalAlignment="Left" Margin="37,83,0,0" VerticalAlignment="Top" Name="cheatingAIRadioButton" IsChecked="{Binding Path=ComputerSkill,Converter={StaticResource skillConverter},ConverterParameter=Cheats}"/>

说明一下ComputerSkill是个枚举值,那么怎么判定是否会调用ConvertBack这方法呢?看两个地方 一个是看IsChecked(任意属性)另一个看Path的ComputerSkill的数据类型(看Path后的数据类型),如果匹配则不会调用ConvertBack这个方法 ,何为匹配 比如IsChecked是布尔型的 如果这个时候ComputerSkill也是布尔型的 那就匹配了,否则将调用ConvertBack这个方法,但是调用了之后 最后还是会回到Convert这个方法执行转换,所以ConvertBack不能忽视,如果ConvertBack没有写内容代码,有时候程序会出错会有意想不到的情况发生,好了 就写到这里 你们自己做做实验就知道了 拜拜!
...全文
404 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weikeli19 2019-03-24
  • 打赏
  • 举报
回复
我更正一下错误 不是看IsChecked和Path后面的数据源的类型,不是看他们匹配不匹配,是这样的 ,WPF应用程序没那么聪明,ComputerSkill是个枚举,里面有很多枚举值,那么如果进行直接转换电脑不会一个枚举值一个枚举值的查询和参数值是否相等,那么这个时候WPF应用程序会有一个行为,就是调用ConvertBack转换回来获得一个枚举值,这样ComputerSkill这个属性所对应的私有字段就有一个值了,这样就可以对每个RadioButton进行验证,一直验证到最后一个RadioButton,这样RadioButton的IsChecked总归有一个值是True,其他都为false。我附上影藏代码,是转换类 代码如下:

namespace KarliCards_Gui
{
[ValueConversion(typeof(ComputerSkillLevel), typeof(bool))]
class ComputerSkillValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType==typeof(bool?))
MessageBox.Show("222222");
string helper = parameter as string;
if (string.IsNullOrWhiteSpace(helper))
return false;
ComputerSkillLevel skillLevel = (ComputerSkillLevel)value;
return (skillLevel.ToString() == helper);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType == typeof(ComputerSkillLevel))
{ MessageBox.Show(((bool?)value).ToString()); }
string parameterString = parameter as string;
if (parameterString == null)
return ComputerSkillLevel.Dumb;
return Enum.Parse(targetType, parameterString);
}
}
}
weikeli19 2019-03-24
  • 打赏
  • 举报
回复 2
引用 6 楼 以专业开发人员为伍 的回复:
举个例子,你想把 UI 图形上的一个水槽的液面高度(假设叫做A,单位“像素”)值跟一个 double 值(单位为“厘米”)绑定,这个转换规则是你自己设计的,那么你就需要一个 Converter 将厘米值转换为像素值。假设你还需要支持交互操作,你肯定还需要一个 ConvertBacker 将像素值转换为厘米值。

接下来,你有需要把 UI 图形上的一个报警灯(假设叫做B,值为“点亮”或者“关闭”)值跟这个double值绑定,仅当这个double值在某一个范围时才亮起警灯,那么这个转换规则也是你自己设计的。也就是把厘米值转换为“点亮、关闭”值,或者如果需要的话就需要一个 ConvertBack。

这么基本的概念,实际上就是是否知道 OneWay 还是 TwoWay 的问题。如果满脑子只有 OneWay,那么就顶多能知道最简单的 MVC 概念而不能方便理解 MVVM 绑定概念。


答非所问 这些人家都知道
  • 打赏
  • 举报
回复
举个例子,你想把 UI 图形上的一个水槽的液面高度(假设叫做A,单位“像素”)值跟一个 double 值(单位为“厘米”)绑定,这个转换规则是你自己设计的,那么你就需要一个 Converter 将厘米值转换为像素值。假设你还需要支持交互操作,你肯定还需要一个 ConvertBacker 将像素值转换为厘米值。 接下来,你有需要把 UI 图形上的一个报警灯(假设叫做B,值为“点亮”或者“关闭”)值跟这个double值绑定,仅当这个double值在某一个范围时才亮起警灯,那么这个转换规则也是你自己设计的。也就是把厘米值转换为“点亮、关闭”值,或者如果需要的话就需要一个 ConvertBack。 这么基本的概念,实际上就是是否知道 OneWay 还是 TwoWay 的问题。如果满脑子只有 OneWay,那么就顶多能知道最简单的 MVC 概念而不能方便理解 MVVM 绑定概念。
  • 打赏
  • 举报
回复
绑定,本来就是有 OneWay 和 TwoWay 区别。如果不懂 TwoWay 操作那不算是 MVVM。
weikeli19 2019-03-21
  • 打赏
  • 举报
回复
我这里补充一下 如果IsChecked是object类型 Binding里的Path后的所有数据类型都匹配 因为它是object所有类类型的基类 最后要传值给IsChecked 我说的是如果IsChecked是object类型
weikeli19 2019-03-21
  • 打赏
  • 举报
回复
引用 1 楼 zhuowp 的回复:
好像找不到一句正确的。


哪里错了 不懂的人勿喷 拒绝喷子 拒绝讽刺 谢谢配合
zhuowp 2019-03-21
  • 打赏
  • 举报
回复
好像找不到一句正确的。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧