XAML IsEnabled绑定无法按预期工作

时间:2018-01-24 03:39:53

标签: c# wpf xaml

我最近不得不使用WPF / XAML跳转到一个新项目。虽然我在C#和ASP.Net MVC方面有丰富的经验,但这种转变对我来说并不像我希望的那样顺利。

问题:

我需要将按钮绑定到复选框。即我需要将Button的IsEnabled属性绑定到CheckBox的IsChecked属性。我似乎无法让它以直接的方式工作,奇怪的是,如果我使用Snoop来禁用按钮,它似乎开始按照我的意愿工作,但只有当我这样做时才会这样做。

要清楚,复选框和按钮都可以按预期独立工作。只需在单击复选框时禁用Button的绑定就无效了。

这大致是我目前的XAML:

<Button Grid.Column="1" Grid.Row="1" Content="get curve" 
     IsEnabled="{Binding ElementName=IsStraightCheckBox, Path=IsChecked, Mode=TwoWay}"
     Command="{Binding CustomCommand}"  
     Style="{DynamicResource ButtonFormStyle}" />
<CheckBox Name="IsStraightCheckBox" IsChecked="{Binding DataObject.Alignment, Converter={StaticResource CustomConverter}, Mode=TwoWay}"/>

CheckBox上的绑定/转换器正在按照我的意愿工作,但我不知道它是否在干扰我正在努力完成的另一端。

我不确定我是否在结构上做错了,或者我只是误解了绑定是如何工作的。

编辑:下面提供的答案通常是我想要完成的正确方法。我的代码库有无关的问题导致绑定失败,因此我的困惑。

1 个答案:

答案 0 :(得分:0)

以下是一些简单的代码:

  • 有一个按钮,其状态由复选框控制
  • 复选框本身由带有简单转换器的切换按钮驱动

<强> XAML:

<Window
    x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid>
        <StackPanel>
            <StackPanel.Resources>
                <local:MyConverter x:Key="Converter" />
            </StackPanel.Resources>
            <Button Content="Click me" IsEnabled="{Binding ElementName=Box, Path=IsChecked}" />
            <CheckBox
                x:Name="Box"
                Content="Enable the button"
                IsEnabled="{Binding ElementName=Toggle, Path=IsChecked, Converter={StaticResource Converter}}" />
            <ToggleButton x:Name="Toggle" Content="Lock the checkbox" />
        </StackPanel>
    </Grid>
</Window>

<强>转换器:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfApp1
{
    internal class MyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value is bool b ? b : DependencyProperty.UnsetValue;
        }

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

几点注释

  • 并不总是信任VS XAML Designer,在这种情况下,按钮在启用XAML复选框时不会做出反应;然而,在Blend中,你可以看到它正在改变
  • 检查输出窗口中的潜在绑定错误,请注意,某些绑定在(大)应用程序启动时会出错是正常的,因为这些很早就会得到评估,当您使用该应用程序时,您会对它们的值感兴趣