C# WPF XAML Trigger Und-Verknüpfung für Visibility

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hey Leute,

ich hab hier ein Problem mit der Sichtbarkeit eines TextBlocks (bin WPF Einsteiger - nur so am Rande).
Und zwar möchte ich die Sichtbarkeit eines Textblocks über einen Style steuern:
Code:
<TextBlock Style="{StaticResource IsTextBlockVisibleStyle}">
       <Run Text=" +" />
       <Run Text="{Binding Path=XYPropertie, Mode=OneWay}" />
</TextBlock>

Im Style habe wollte ich anhand von Triggern folgendes abbilden:
Code:
if ( intValue >0 && Liste.Count == 1 ) { Visiblity = visible}
else {visiblity = collapsed}

Also ich arbeite noch mit Convertern. Der eine Prüft auf größer als und der andere auf Gleichheit.
Das habe ich dann mal in DataTriggern eingebaut. Leider klappt es bei mir nicht richtig.
Vermute mal, dass die DataTrigger nicht &-Verknüpfen. Leider bin ich da echt unwissend...
Code:
<Style x:Key="IsTextBlockVisibleStyle"
           BasedOn="{StaticResource TextBlockStyle}"
           TargetType="TextBlock">
	<Setter Property="Visibility"
		    Value="Collapsed" />
	<Style.Triggers>
		<DataTrigger Value="True">
			<DataTrigger.Binding>
				<MultiBinding Converter="{StaticResource IsBiggerThanConverter}">
					<Binding Path="intValue" />
					<Binding Source="{StaticResource IntZero}" />
				</MultiBinding>
			</DataTrigger.Binding>
			<Setter Property="Visibility"
				     Value="Visible" />
		</DataTrigger>
		<DataTrigger Value="True">
			<DataTrigger.Binding>
				<MultiBinding Converter="{StaticResource IsIdenticalConverter}">
					<Binding Path="Liste.Count" />
					<Binding Source="{StaticResource IntOne}" />
				</MultiBinding>
			</DataTrigger.Binding>
				<Setter Property="Visibility"
					    Value="Visible" />
		</DataTrigger>
	</Style.Triggers>
</Style>
 
Moin palaber,

Trigger stehen in WPF immer für sich, da jeder Trigger unterschiedliche Setter haben kann. Sie werden immer unabhängig voneinander ausgeführt. Wenn du mehrere Bedingungen hast, die alle erfüllt werden müssen (AND), dann musst du stattdessen einen einzelnen MultiDataTrigger verwenden:

Code:
<Style x:Key="IsTextBlockVisibleStyle" TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle}">
    <Setter Property="Visibility" Value="Collapsed" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IntValue, Converter={StaticResource IsGreaterThanConverter}, ConverterParameter=0}" Value="True" />
                <Condition Binding="{Binding Liste.Count}" Value="1" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Visibility" Value="Visible" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>
MultiBindings brauchst du auch nicht, wenn du den ConverterParameter nutzt.

Code:
public class IsGreaterThanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int? iValue = value as int?;
        int iParameter;

        if (iValue == null || !Int32.TryParse(parameter.ToString(), out iParameter)) return false;

        return iValue > iParameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Zu guter Letzt kannst du auf die Runs in deiner Textbox verzichten, wenn du nur an dein Objekt bindest und StringFormat verwendest. Da du ein führendes Leerzeichen möchtest, brauchst du das {} hinter dem StringFormat (ansonsten würde das Leerzeichen als überflüssig interpretiert und entfernt werden).
Code:
<TextBlock Text="{Binding XYPropertie, StringFormat={} + {0}}" Style="{StaticResource IsTextBlockVisibleStyle}" />
 
Zurück
Oben