IValueConverter参数检查

Kev*_*tsu 1 c# wpf mvvm

我使用 IValueConverter 设置一个复选框。\n但是我有三个复选框,并且我像 RadioButton 一样使用。选择其中一项后,需要取消选中其他项。

\n\n

所以我做了类似的事情>

\n\n
<MenuItem StaysOpenOnClick="True" \n          Header="Reiniciar \xc3\xa1udio"\n          IsCheckable="True"\n          Name="RestartAudioCheck" \n          IsChecked="{Binding PlayType, \n          Mode=TwoWay,\n          Converter={StaticResource PlayTypeCheckedConverter},\n          ConverterParameter=restart}">\n</MenuItem>\n<MenuItem StaysOpenOnClick="True" \n          Header="Parar \xc3\xa1udio"\n          IsCheckable="True"\n          Name="StopAudioCheck"\n          IsChecked="{Binding PlayType, \n            Mode=TwoWay,\n          Converter={StaticResource PlayTypeCheckedConverter},\n          ConverterParameter=stop}">\n</MenuItem>\n<MenuItem StaysOpenOnClick="True" \n          Header="Pausar \xc3\xa1udio"\n          IsCheckable="True"\n          Name="PauseAudioCheck"\n          IsChecked="{Binding PlayType, \n            Mode=TwoWay,\n          Converter={StaticResource PlayTypeCheckedConverter},\n          ConverterParameter=pause}">\n</MenuItem>\n
Run Code Online (Sandbox Code Playgroud)\n\n

和转换器:

\n\n
class PlayTypeCheckedConverter : IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (!(value is PlayType type))\n            return false;\n\n        if (!(parameter is string check))\n            return false;\n\n        if (check.CompareTo("restart") == 0 && type == PlayType.Restart)\n            return true;\n        if (check.CompareTo("stop") == 0 && type == PlayType.Stop)\n            return true;\n        if (check.CompareTo("pause") == 0 && type == PlayType.Pause)\n            return true;\n\n        return false;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (!(value is bool isChecked))\n            return true;\n\n        if (!(parameter is string type))\n            return PlayType.Restart;\n\n        if (type.CompareTo("restart") == 0 && isChecked)\n            return PlayType.Restart;\n        if (type.CompareTo("stop") == 0 && isChecked)\n            return PlayType.Stop;\n        if (type.CompareTo("pause") == 0 && isChecked)\n            return PlayType.Pause;\n\n        return PlayType.Restart;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的问题是:传递像绝对文本这样的 ConverterParameter 作为示例来了解转换器上的某些内容是错误的吗?\n就像我做的那样,效果很好。

\n

ASh*_*ASh 5

对于任何属性类型都可以有一个等式转换器。使用它的技巧是传递特定类型的参数,而不是字符串表示形式。

转换器:

public class EqualityCheckConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Equals(value, parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (Equals(value, true))
            return parameter;

        return Binding.DoNothing;
    }
}
Run Code Online (Sandbox Code Playgroud)

示例enum

// property to bind
public DayOfWeek Day { get; set; }
Run Code Online (Sandbox Code Playgroud)

捆绑:

<Window.Resources>
    <wpfDemos:EqualityCheckConverter x:Key="EqualCheckedConverter"/>
</Window.Resources>

<Menu>
    <MenuItem StaysOpenOnClick="True" 
              Header="Tuesday"
              IsCheckable="True"
              IsChecked="{Binding Day, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={x:Static system:DayOfWeek.Tuesday}}"/>

    <MenuItem StaysOpenOnClick="True" 
              Header="Wednesday"
              IsCheckable="True"
              IsChecked="{Binding Day, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={x:Static system:DayOfWeek.Wednesday}}"/>

    <MenuItem StaysOpenOnClick="True" 
              Header="Thursday"
              IsCheckable="True"
              IsChecked="{Binding Day, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={x:Static system:DayOfWeek.Thursday}}"/>
</Menu>
Run Code Online (Sandbox Code Playgroud)

示例与int

public int TestNum { get; set; }
Run Code Online (Sandbox Code Playgroud)
<Window.Resources>
    <wpfDemos:EqualityCheckConverter x:Key="EqualCheckedConverter"/>
    <system:Int32 x:Key="Zero">0</system:Int32>
    <system:Int32 x:Key="Ten">10</system:Int32>
</Window.Resources>
<Menu>
    <MenuItem StaysOpenOnClick="True" 
              Header="0"
              IsCheckable="True"
              IsChecked="{Binding TestNum, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={StaticResource Zero}}"/>

    <MenuItem StaysOpenOnClick="True" 
              Header="10"
              IsCheckable="True"
              IsChecked="{Binding TestNum, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={StaticResource Ten}}"/>
</Menu>
Run Code Online (Sandbox Code Playgroud)