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