В WPF MenuItem можно использовать противоположное значение bool
В WPF у меня есть два пункта меню, которые взаимно противоположны (X отмечен, затем Y снят и наоборот).
Можно ли использовать одно свойство bool для связывания этих двух?
Например, ниже, я использовал!IsX, и он не работает!
<MenuItem Header="X or Y">
<MenuItem IsCheckable="True" Header="Is X?" IsChecked="{Binding Path=IsX, Mode=TwoWay}" />
<MenuItem IsCheckable="True" Header="Is Y?" IsChecked="{Binding Path=!IsX, Mode=TwoWay}" />
</MenuItem>
1 ответ
Решение
Вам нужно написать собственный конвертер для этого:
[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBooleanConverter: IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (targetType != typeof(bool))
throw new InvalidOperationException("The target must be a boolean");
return !(bool)value;
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (targetType != typeof(bool))
throw new InvalidOperationException("The target must be a boolean");
return !(bool)value;
}
#endregion
}
И тогда в вашей разметке:
<MenuItem Header="X or Y">
<MenuItem IsCheckable="True" Header="Is X?" IsChecked="{Binding Path=IsX, Mode=TwoWay}" />
<MenuItem IsCheckable="True" Header="Is Y?" IsChecked="{Binding Path=IsX, Mode=TwoWay, Converter={StaticResource InverseBooleanConverter}}" />
</MenuItem>
Также вы должны создать экземпляр этого в вашем файле ресурсов