Graviton
Graviton

Reputation: 83326

IsEnabled property cannot be binded to a DependencyProperty and IValueConverter

I have the following code:

XAML code:

<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# Code

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

I would expect that the EnumConverter would be called as I am setting the DependencyProperty SectionTitle and any breakpoint inside the method will be hit.

However this doesn't seem to be the case; and the IsEnabled property is not being binded to SectionTitle as I wish.

What's wrong with this code?

Upvotes: 1

Views: 53

Answers (3)

Marc
Marc

Reputation: 189

You need to set the DataContext of your MainWindow. You can esaily do this inside the constructor:

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

    ...

Upvotes: 0

Michał Turczyn
Michał Turczyn

Reputation: 37525

Define Name property on your Window with Name="MyWindow", then use it in your binding like this:

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

Upvotes: 1

Flat Eric
Flat Eric

Reputation: 8111

The problem is the DataContext. The binding does not find its target.

You can set the context in the declaration of the window. Add this to the Window tag in your XAML:

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

Upvotes: 3

Related Questions