Кнопка скрытия и отображения WPF в зависимости от значения текстового контекста - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть 2 кнопки вроде этого:

<Button x:Name="button1" Content="Button 1"/>
<Button x:Name="button2" Content="Button 2"/>

И у меня есть переменная bool в моем DataContext с именем IsButton1Visible, и я хотел бы, чтобы button1 была видимой, а button2 свернутой, если IsButton1Visible == true и button1 быть свернутым и button2 видимым, если IsButton1Visible == false. Возможно ли выполнить sh БЕЗ использования стиля или кода? Ответы на XAML - это в основном то, что я ищу.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Почему вы не хотите использовать стиль? Это, безусловно, самый простой способ сделать это.

Один из способов сделать это без стиля - с помощью преобразователя логической видимости, то есть что-то вроде этого:

public class BooleanToVisibilityConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return false;
        var invert = (parameter == null) ? false : Boolean.Parse(parameter.ToString());
        if ((Boolean)value ^ invert)
            return Visibility.Visible;
        else
            return Visibility.Hidden;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Какой вы затем будет использовать так:

<Button x:Name="button1" Content="Button 1" Visibility="{Binding IsButton1Visible, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button x:Name="button2" Content="Button 2" Visibility="{Binding IsButton1Visible, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=true}" />

Если серьезно, просто используйте DataTrigger в стиле, чтобы изменить видимость или, что еще лучше, создать шаблон всего элемента управления. Преобразователи - это то, что вы используете, когда данные должны быть преобразованы между слоями представления и модели, а триггеры данных - это то, что вы используете, когда они только односторонние.

1 голос
/ 25 февраля 2020

Существует встроенный BooleanToVisibilityConverter, который можно использовать для преобразования между bool и Visibility:

<Button x:Name="button1" Content="Button 1">
    <Button.Visibility>
        <Binding Path="IsButton1Visible">
            <Binding.Converter>
                <BooleanToVisibilityConverter />
            </Binding.Converter>
        </Binding>
    </Button.Visibility>
</Button>

Вы можете определить свой собственный инвертированный преобразователь и связать Visibility свойство второй кнопки аналогично:

public class BooleanToVisibilityNegationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
        (bool)value ? Visibility.Collapsed : Visibility.Visible;

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
        ((Visibility)value) == Visibility.Visible ? false : true;
}

XAML:

<Button x:Name="button1" Content="Button 1">
    <Button.Visibility>
        <Binding Path="IsButton1Visible">
            <Binding.Converter>
                <local:BooleanToVisibilityNegationConverter />
            </Binding.Converter>
        </Binding>
    </Button.Visibility>
</Button>

Это не требует определения какого-либо стиля или написания какого-либо кода, но это действительно требует, чтобы вы определили класс преобразователя выше.

Другое решение только для XAML - это встроенный Style для второй кнопки. Для этого требуется нулевой код:

<Button x:Name="button1" Content="Button 1">
    <Button.Visibility>
        <Binding Path="IsButton1Visible">
            <Binding.Converter>
                <BooleanToVisibilityConverter />
            </Binding.Converter>
        </Binding>
    </Button.Visibility>
</Button>

<Button x:Name="button2" Content="Button 2">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsVisible, ElementName=button1}" Value="True">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...