Связывание Видимость другого элемента - и инвертирование - PullRequest
23 голосов
/ 04 ноября 2010

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

Ответы [ 3 ]

24 голосов
/ 04 ноября 2010

В этом случае вы можете сделать это с помощью триггеров. Пример с двумя кнопками

<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"/>
6 голосов
/ 04 ноября 2010

Итог, я не вижу проблем с тем, что вы делаете.

Тем не менее, если у вас есть свойство в ViewModel, к которому привязывается элемент управления A для управления его видимостью, я бы привязал элемент управления B к тому же свойству и инвертировал бы видимость через отдельный конвертер. Я не уверен, что могу сформулировать почему, но мне это кажется более естественным (по крайней мере, вместо какого-либо дополнительного контекста вокруг того, что вы делаете).

3 голосов
/ 04 ноября 2010

То, что вы делаете, хорошо, но я предпочитаю использовать более общие преобразователи и сохранять симметрию со встроенными преобразователями.

Так что я бы сделал InverseBooleanToVisibiltyConverter, который принимает логические значения и возвращает типы видимости. Это соответствует встроенному BoolenToVisibiltyConverter

Тогда я бы связал свойство IsVisible кнопки, а не свойство Visibility.

Но это действительно вопрос предпочтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...