有没有办法将按钮的Enabled属性绑定到复选框的Checked属性?

时间:2014-07-28 18:24:22

标签: c# wpf

我想在WPF中绑定Button的IsEnabled,如下所示:

WPF代码:

<Button Content="TestButton" IsEnabled="{Binding ??}" />

C#代码:

private MyObjectClass _Checked; 

public MyObjectClass Checked 
{ 
    get { return _Checked; } 
    set 
    { 
        _Checked = value; 
        RaisePropertyChanged("Checked"); 
    } 
}

在上面的WPF代码中,我希望仅当Checked对象不为null时才启用该按钮。我知道一种方法是在C#代码中有一个bool属性,告诉我Checked对象是否为null,然后将其绑定到IsEnabled属性。我想知道是否有一种方法可以直接将IsEnabled绑定到Checked对象?

2 个答案:

答案 0 :(得分:2)

使用DataTrigger并检查 {x:Null} 绑定值:

<Button Content="TestButton">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Checked}" Value="{x:Null}">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

此外,您可以使用IValueConverter,如果value为null,则返回false,否则为true。

public class ObjectToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                         CultureInfo culture)
    {
        bool returnValue = true;
        if (value == DependencyProperty.UnsetValue || value == null)
        {
            returnValue = false;
        }
        return returnValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                              CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

并在XAML中绑定:

<Button Content="TestButton"
        IsEnabled="{Binding Checked,
                    Converter={StaticResource ObjectToBoolConverter}}" />

当然,您需要在XAML中声明转换器的实例。

答案 1 :(得分:0)

您可以使用转换器将对象转换为bool。查看IValueConverter。

public class IsNotNullToBoolConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Two-way binding not supported by IsNotNullToBoolConverter");
    }
}

你的xaml看起来像这样:

<Window.Resources>
  <local:IsNotNullToBoolConverter x:Key="IsNotNull" />
</Window.Resources>

...

<Button IsEnabled="{Binding Converter={StaticResource IsNotNull}}" />