Привязка DataTrigger в кнопке не отражается при изменении значения - PullRequest
1 голос
/ 22 апреля 2020

У меня есть кнопка, видимость которой меняется в зависимости от значения. Вот мой код

        <Button Content="Click Me" Grid.Column="1" Click="Button_Click" Width="100" Height="100">
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Visibility" Value="Visible"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=isShow, Mode=TwoWay}" Value="True">
                            <Setter Property="Visibility" Value="Hidden"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=isShow, Mode=TwoWay}" Value="False">
                            <Setter Property="Visibility" Value="Visible"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
public bool isShow { get; set; }       
private void Button_Click(object sender, RoutedEventArgs e)
{
   this.isShow = !this.isShow;
}

Я новичок в C# и привыкаю к ​​привязкам данных. Пожалуйста, дайте мне знать, где я go ошибся.

1 Ответ

1 голос
/ 22 апреля 2020

Вы должны реализовать INotifyPropertyChanged и вызвать событие PropertyChanged из установщика свойства isShow для Visibility, чтобы обновляться всякий раз, когда для свойства источника динамически устанавливается новое значение :

public class MainWindow : Window, INotifyPropertyChanged
{
    ...

    private bool _isShow;
    public bool isShow
    {
        get { return _isShow; }
        set { _isShow = value; NotifyPropertyChanged(); }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.isShow = !this.isShow;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Вы также можете удалить один из триггеров:

<Button Content="Click Me" Grid.Column="1" Click="Button_Click" Width="100" Height="100">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=isShow, Mode=TwoWay}" Value="True">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
...