Search code examples
c#wpfbindingdatacontext

wpf how to bind to DataContext existence?


I set the datacontext dynamically in code. I would like a button on screen to be enabled/disabled depending if DataContext == null or not. I can do it in code when I assign the DataContext but it would be better if I can bind like that :)


Solution

  • You should be able to use a DataTrigger on the button style to disable your button when the DataContext is null. The other option is to bind the IsEnabled property to the DataContext and use a value converter to return false if DataContext is null and true otherwise.

    With trigger:

    <Button>
       <Button.Style>
           <Style TargetType="{x:Type Button}">
              <Style.Triggers>
                 <DataTrigger Binding="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}" Value="{x:Null}">
                     <Setter Property="IsEnabled" Value="false"/>
                 </DataTrigger>
              </Style.Triggers>
           </Style>
       </Button.Style>
    </Button>
    

    With converter:

    Converter:

    public class DataContextSetConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value != null;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    And use it

    <UserControl.Resources>
       <local:DataContextSetConverter x:Key="dataContextSetConverter"/>
    </UserControl.Resources>
    
    ...
    
    <Button IsEnabled="{Binding Path=DataContext, RelativeSource={RelativeSource Self}, Converter={StaticResource dataContextSetConverter}}"/>