我最近不得不使用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上的绑定/转换器正在按照我的意愿工作,但我不知道它是否在干扰我正在努力完成的另一端。
我不确定我是否在结构上做错了,或者我只是误解了绑定是如何工作的。
编辑:下面提供的答案通常是我想要完成的正确方法。我的代码库有无关的问题导致绑定失败,因此我的困惑。
答案 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();
}
}
}
几点注释