将Button.IsEnabled绑定到布尔属性

时间:2015-08-12 13:45:42

标签: c# wpf data-binding

我有一个布尔属性,它查看几个复选框,如果选中其中任何一个,则返回true。如果选中任何复选框,我想启用一个按钮(属性返回true)。

目前我有以下内容:

  • 数据上下文集

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }
    
  • 按钮绑定集

    <Button Name="button" IsEnabled="{Binding ButtonEnabled}">Apply</Button>
    
  • 财产

    public bool ButtonEnabled
    {
        get
        {
            if(checkboxes_enabled)
                return true;
            else
                return false;
        }
    }
    

我已经确认该属性正在按预期更新,因此它已缩小到绑定问题。我还尝试了按钮中的数据触发器:

<Button Name="button" Content="Apply">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ButtonEnabled}" Value="True">
                    <Setter Property="IsEnabled" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ButtonEnabled}" Value="False">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

3 个答案:

答案 0 :(得分:5)

两件事:

如果要对绑定的属性进行更新,则需要INotifyPropertyChanged

public class MyClass
{
    private bool _buttonEnabled;
    public bool ButtonEnabled
    {
        get
        {
            return _buttonEnabled;
        }
        set
        {
            _buttonEnabled = value;
            OnPropertyChanged();
        }
    }

    public SetButtonEnabled()
    {
        ButtonEnabled = checkboxes_enabled;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged<T>([CallerMemberName]string caller = null) 
    {
        var handler = PropertyChanged;
        if (handler != null) 
        {
            handler(this, new PropertyChangedEventArgs(caller));
        }
    }
}

您也应该没有两个触发器,只需使用默认值。

<Button Name="button" Content="Apply">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="IsEnabled" Value="True"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ButtonEnabled}" Value="False">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

答案 1 :(得分:1)

您需要添加以下代码才能实现INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

然后从属性设置器

调用OnPropertyChanged

答案 2 :(得分:1)

我建议将按钮绑定到命令而不是事件,这样你就可以设置命令&#34; canexecute&#34;属性为false并禁用整个命令,实习生将为您禁用该按钮。

我建议使用以下教程来深入了解WPF命令以及如何使用它们。一旦了解它们的工作原理,我发现它们非常有用。

http://www.codeproject.com/Articles/274982/Commands-in-MVVM#hdiw1