我正在使用IValueConverter设置复选框。
但是我有三个复选框,而Im就像RadioButton一样使用。选择一个后,另一个则需要取消选中。

所以我做了类似的事情>

<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>

和转换器:
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作为示例以了解有关转换器的信息是错误的?
就像我做得很好。

最佳答案

像您一样,显式比较字符串文字通常被认为是不好的做法。是否使用WPF,出于明显的原因,它容易出现运行时错误,并且不存在类型检查。

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

  • 最普遍的方法是在 View 模型中添加三个属性,只要满足状态,仅使用基本上返回true或false的getter。然后,当“播放状态”更改时,您可以提高所有这三个 bool 属性的更改属性。

  • 在此 View 模型示例中,您可以将 View 各自的属性(IsPlayingIsStoppedIsPaused)绑定(bind)到 View 中的每个复选框:
        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; }
        }
    
  • 将XAML中的DataTrigger用于PlayState属性上的复选框。然后,您可以检查键入的枚举值而不是字符串文字。
  • 关于c# - IValueConverter参数检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52484890/

    10-12 01:24
    查看更多