【问题标题】:Is there a way to bind the Enabled property of a button to a checkbox's Checked property?有没有办法将按钮的 Enabled 属性绑定到复选框的 Checked 属性?
【发布时间】:2014-07-28 18:24:21
【问题描述】:

我想在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 对象不为空时才启用按钮。我知道一种方法是在 C# 代码中有一个 bool 属性,它告诉我 Checked 对象是否为空,然后将其绑定到 IsEnabled 属性。我想知道是否可以直接将 IsEnabled 绑定到 Checked 对象?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    使用 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,如果值为 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 中声明转换器实例。

    【讨论】:

      【解决方案2】:

      您可以使用转换器将对象转换为布尔值。查看 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}}" />
      

      【讨论】:

      • 你能说得更具体一点吗,也许有一些示例代码?
      • 本来打算做的 :) 只是还没打完,呵呵。
      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多