0
votes

I have the following style defined in my XAML to enable buttons only when something in the DataContext has changed (IsDirty = true) :

   <!-- Style for Buttons to enable based on IsDirty value -->
    <Style x:Key="EnableWhenDirtyButtonStyle" TargetType="{x:Type Button}"
           BasedOn="{StaticResource ButtonStyle}">
        <Setter Property="IsEnabled" Value="False" />
        <Style.Triggers>
            <!-- Enable button when something has changed -->
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
                                           AncestorType={x:Type UserControl}}, Path=DataContext.IsDirty}" Value="True">
                <Setter Property="Button.IsEnabled" Value="true" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

This works as long as there is only one DataContext within the UserControl. I now have the situation where I have 3 different DataViews so I have 3 different IsDirty values (i.e., CustomerTableIsDirty, OrderTableIsDirty, OrderDetailTableIsDirty). In this case I can create three new *DisableWhenDirtyButtonStyle in the UserControl like:

        <Style x:Key="CustomerTableEnableWhenDirtyButtonStyle" 
               TargetType="{x:Type Button}" 
               BasedOn="{StaticResource ButtonStyle}">
            <Setter Property="Button.IsEnabled" Value="False" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=CustomerTableIsDirty}" Value="true">
                    <Setter Property="Button.IsEnabled" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

Is there a way to create a DataTrigger such that the binding value can be passed into the style as a parameter?

Alternatively, is there a way to add conditions to a MultiDataTrigger when inheriting a style via 'BasedOn' which would already have a MultiDataTrigger defined. For instance:

<Style x:Key="CustomerTableEnableWhenDirtyButtonStyle" 
                   TargetType="{x:Type Button}" 
                   BasedOn="{StaticResource EnableWhenDirtyButtonStyle}">

     <!-- Add the following to existing MultiDataTrigger in EnableWhenDirtyButtonStyle -->
     <Condition Binding="{Binding Path=CustomerTableIsDirty}" Value="true" />

</Style>

I CANNOT use MultiBinding as this style is part of a base project which gets used by multiple other projects (as a DLL). The users of this DLL would not be able to update the style to include the necessary Binding Path.

1
How about creating attached behavior? Something like described here. - Rohit Vats

1 Answers

0
votes

Instead of using 3 different names, just use a single name IsDirty.