Проверка параметров IValueConverter - PullRequest
0 голосов
/ 24 сентября 2018

Я использую IValueConverter, чтобы установить флажок.Но у меня есть три флажка, и я использую как 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 как абсолютный текст в качестве примера, чтобы узнать что-то о конвертере?Как будто я работал очень хорошо.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Возможно иметь один конвертер равенства для любого типа свойства.Хитрость его использования заключается в передаче параметров определенного типа вместо строкового представления.

преобразователь:

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:

// property to bind
public DayOfWeek Day { get; set; }

переплет:

<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

public int TestNum { get; set; }
<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>
0 голосов
/ 24 сентября 2018

Явное сравнение строковых литералов, как вы это делали, вообще считается плохой практикой.WPF или нет, по понятным причинам, он подвержен ошибкам во время выполнения и проверки типов не существует.

Существует два решения, о которых я мог бы подумать:

  1. Наиболее распространенным способом было быдобавить три свойства в модель представления с использованием только методов получения, которые в основном возвращают значение true или false, если состояние удовлетворено.Затем вы можете поднять свойство, измененное для всех этих трех логических свойств, при изменении состояния воспроизведения.

Из этого примера модели представления вы можете привязать к каждому флажку в представлении их соответствующие свойства (IsPlaying, IsStopped, IsPaused):

    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; }
    }
Используйте DataTrigger в своем XAML для флажков в свойстве PlayState.Затем вы можете проверить типизированные значения перечисления вместо строковых литералов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...