Search code examples
wpfbindingsetterdatatrigger

DataTrigger setter called only once


I have this following style. My problem is that even tho multibinding is always true, I am observing setter only once when Window is loaded. Whenever I change Window Height this MyMultiValueConverter is being called I can see it in logs, but not the "<Setter>".

<Style x:Key="SeperatorRectangleStyle" TargetType="Rectangle">
    <Setter Property="Width" Value="2"/>
    <Setter Property="Height" Value="50"/>
    <Setter Property="MinHeight" Value="49"/>
    <Style.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource myTheMultiValueConverter}">
                    <Binding RelativeSource="{RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}" Path="ActualHeight"/>
                    <Binding RelativeSource="{RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}" Path="Name"/>
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="Height" Value="{Binding Converter={StaticResource mySeperatorHeightConverter}, ConverterParameter=DataTrigger}"/>

        </DataTrigger>
    </Style.Triggers>
</Style>

MyMultiValueConverter is:

class TheMultiValueConverter : IMultiValueConverter
            {
                public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
                {
                   foreach (var i in values)
                  {
                      Console.WriteLine("TheMultiValueConverter values" + i);
                  }
                  Console.WriteLine("");
                   return true 
            }
}

MySeperatorHeightConverter is

    class SeperatorHeightConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                Console.WriteLine("!-!- SeperatorHeightConverter: " + parameter);
                return 100;
            }
    }

Solution

  • The problem in your code is that you Bind something to the Height that does not change. That is why the second converter does not get triggered.

    See this code:

     <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualHeight, Converter={StaticResource mySeperatorHeightConverter}, ConverterParameter=DataTrigger}"/>
    

    This small change makes it so that the SeperatorHeightConverter gets triggered everytime the Window Height changes.