IsEnabled属性不能绑定到DependencyProperty和IValueConverter

问题描述 投票:1回答:3

我有以下代码:

XAML代码:

<Window x:Class="combobinding.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:combobinding"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Window.Resources>
        <local:EnumConverter x:Key="isEnabledConverter" />
    </Window.Resources>
    <Grid>
        <TextBox Text="Hello"  IsEnabled="{Binding SectionTitle, Converter={StaticResource isEnabledConverter}}" />
    </Grid>
</Window>

C#代码

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        public static readonly DependencyProperty SectionTitleProperty =
DependencyProperty.Register(nameof(SectionTitle),
                         typeof(SectionTitle),
                         typeof(MainWindow));

        public SectionTitle SectionTitle
        {
            get { return (SectionTitle)GetValue(SectionTitleProperty); }
            set { SetValue(SectionTitleProperty, value); }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            SectionTitle = SectionTitle.TitleBlock;
        }
    }

    public enum SectionTitle
    {
        Normal,
        TitleBlock
    }
    public class EnumConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var sectionType = (SectionTitle)value;
            if (sectionType == SectionTitle.Normal)
                return true;
            return false;

        }

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

我希望EnumConverter会被调用,因为我正在设置DependencyProperty SectionTitle并且该方法内的任何断点都将被击中。

然而,情况似乎并非如此;并且IsEnabled财产没有按照我的意愿被绑定到SectionTitle

这段代码出了什么问题?

c# wpf data-binding
3个回答
3
投票

问题是DataContext。绑定找不到它的目标。

您可以在窗口的声明中设置上下文。将其添加到XAML中的Window标记:

 DataContext="{Binding RelativeSource={RelativeSource Self}}"

1
投票

使用NameWindow上定义Name="MyWindow"属性,然后在你的绑定中使用它,如下所示:

<TextBox Text="Hello" IsEnabled="{Binding ElementName=MyWindow, Path=SectionTitle, Converter={StaticResource isEnabledConverter}}" />

0
投票

您需要设置MainWindow的DataContext。您可以在构造函数中轻松完成此操作:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    ...
© www.soinside.com 2019 - 2024. All rights reserved.