Связывание с видимостью другого элемента - и инвертирование
Я хочу сделать Control A visibile, если Control B скрыт, и наоборот. Прямо сейчас у меня есть этот конвертер:
public class InvertVisibilityConverter : IValueConverter {
public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
if (targetType == typeof(Visibility)) {
Visibility vis = (Visibility)value;
return vis == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
}
throw new InvalidOperationException("Converter can only convert to value of type Visibility.");
}
public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
throw new Exception("Invalid call - one way only");
}
}
И этот XAML:
<Button Visibility="{Binding ElementName=btn1, Path=Visibility, Converter={StaticResource InvertVisibilityConverter}}">Btn2</Button>
Что работает. Мне просто интересно, есть ли более прямой способ в WPF/Silverlight для этого? Я не против иметь конвертер, я просто хочу убедиться, что нет лучшего способа, о котором я не знаю.
Ответы
Ответ 1
В нижней строке, я не вижу проблем с тем, что вы делаете.
Тем не менее, если у вас есть свойство в ViewModel, к которому связывается Control A, чтобы контролировать его видимость, я бы привязал Control B к тому же свойству и инвертировал видимость через отдельный конвертер. Я не уверен, могу ли я сформулировать почему, но это кажется мне более естественным (по крайней мере, вместо любого дополнительного контекста вокруг того, что вы делаете).
Ответ 2
В этом случае вы можете сделать это с помощью триггеров. Пример с двумя кнопками
<Button Name="button1">
<Button.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=button2, Path=Visibility}" Value="Visible">
<Setter Property="Button.Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button Name="button2"/>
Ответ 3
Что вы делаете хорошо, но я предпочитаю более общие конвертеры и сохранять симметрию со встроенными преобразователями.
Итак, я бы сделал InverseBooleanToVisibiltyConverter, который принимает логические значения и возвращает типы видимости. Это соответствует встроенному BoolenToVisibiltyConverter
Затем я бы привязал свойство IsVisible кнопки, а не свойство Видимость.
Но это действительно вопрос предпочтения.