首页 文章

XAML IsEnabled绑定无法按预期工作

提问于
浏览
-1

我最近不得不使用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

    这是一些简单的代码:

    • 有一个按钮,其状态由复选框控制

    • 复选框本身由带有简单转换器的切换按钮驱动

    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>
    

    Converter:

    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();
            }
        }
    }
    

    Few notes

    • 并不总是信任VS XAML Designer,在这种情况下,按钮在启用XAML复选框时不会做出反应;然而,在Blend中,你可以看到它在变化

    • 检查输出窗口中的潜在绑定错误,请注意,某些绑定在(大)应用程序启动时会出错是正常的,因为这些很早就会被评估,当您使用该应用程序时,它们会对它们的值感兴趣

相关问题