首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IValueConverter参数校验

IValueConverter参数校验
EN

Stack Overflow用户
提问于 2018-09-24 17:57:43
回答 2查看 968关注 0票数 1

我使用IValueConverter设置一个复选框。但是我有三个复选框,我使用的方式就像一个RadioButton。当一个被选中时,另一个需要被取消检查。

所以我做了像that>这样的事情

代码语言:javascript
运行
复制
<MenuItem StaysOpenOnClick="True" 
          Header="Reiniciar áudio"
          IsCheckable="True"
          Name="RestartAudioCheck" 
          IsChecked="{Binding PlayType, 
          Mode=TwoWay,
          Converter={StaticResource PlayTypeCheckedConverter},
          ConverterParameter=restart}">
</MenuItem>
<MenuItem StaysOpenOnClick="True" 
          Header="Parar áudio"
          IsCheckable="True"
          Name="StopAudioCheck"
          IsChecked="{Binding PlayType, 
            Mode=TwoWay,
          Converter={StaticResource PlayTypeCheckedConverter},
          ConverterParameter=stop}">
</MenuItem>
<MenuItem StaysOpenOnClick="True" 
          Header="Pausar áudio"
          IsCheckable="True"
          Name="PauseAudioCheck"
          IsChecked="{Binding PlayType, 
            Mode=TwoWay,
          Converter={StaticResource PlayTypeCheckedConverter},
          ConverterParameter=pause}">
</MenuItem>

和转换器:

代码语言:javascript
运行
复制
class PlayTypeCheckedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is PlayType type))
            return false;

        if (!(parameter is string check))
            return false;

        if (check.CompareTo("restart") == 0 && type == PlayType.Restart)
            return true;
        if (check.CompareTo("stop") == 0 && type == PlayType.Stop)
            return true;
        if (check.CompareTo("pause") == 0 && type == PlayType.Pause)
            return true;

        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is bool isChecked))
            return true;

        if (!(parameter is string type))
            return PlayType.Restart;

        if (type.CompareTo("restart") == 0 && isChecked)
            return PlayType.Restart;
        if (type.CompareTo("stop") == 0 && isChecked)
            return PlayType.Stop;
        if (type.CompareTo("pause") == 0 && isChecked)
            return PlayType.Pause;

        return PlayType.Restart;
    }
}

我的问题是:像一个绝对文本一样传递一个ConverterParameter作为例子来了解转换器上的东西是不对的?就像我干得很好一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-24 20:05:12

像您所做的那样,显式地比较字符串文本通常被认为是一种糟糕的做法。WPF是否正确,原因很明显,因为它容易出现运行时错误,并且不存在类型检查。

我可以想到两种解决方案:

  1. 最常见的方法是在View中添加三个属性,只要满足状态,就只返回true或false。然后,当Play状态更改时,您可以为这三个布尔属性引发更改的属性。

从视图模型的这个示例中,可以绑定到视图中的每个复选框--它们各自的属性(IsPlayingIsStoppedIsPaused):

代码语言:javascript
运行
复制
    private State _playState;
    public State PlayState
    {
        get { return _playState; }
        set {

            SetProperty(ref _playState, value);
            RaisePropertyChanged(nameof(IsPlaying));
            RaisePropertyChanged(nameof(IsPaused));
            RaisePropertyChanged(nameof(IsStopped));
        }
    }

    public bool IsPlaying
    {
        get { return _playState == State.Playing; }
    }
    public bool IsPaused
    {
        get { return _playState == State.Paused; }
    }
    public bool IsStopped
    {
        get { return _playState == State.Stopped; }
    }
  1. 在XAML中使用DataTrigger作为PlayState属性的复选框。然后,可以检查类型枚举值,而不是字符串文本。
票数 2
EN

Stack Overflow用户

发布于 2018-09-25 19:21:43

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

转换器:

代码语言:javascript
运行
复制
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;
    }
}

使用enum的示例

代码语言:javascript
运行
复制
// property to bind
public DayOfWeek Day { get; set; }

具有约束力:

代码语言:javascript
运行
复制
<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>

使用int的示例

代码语言:javascript
运行
复制
public int TestNum { get; set; }
代码语言:javascript
运行
复制
<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>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52484890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档