我们都知道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没有写内容代码,有时候程序会出错会有意想不到的情况发生,好了 就写到这里 你们自己做做实验就知道了 拜拜!
<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没有写内容代码,有时候程序会出错会有意想不到的情况发生,好了 就写到这里 你们自己做做实验就知道了 拜拜!
{
[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);
}
}
}