Digamos que tengo las siguientes clases:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class PersonHolder
{
    public Person CurrentPerson { get; set; }
    public int ActiveId { get; set; }
}

Ahora tengo una red con una instancia de la clase PersonHolder como DataContext, y en la red tengo un StackPanel que está enlazado a la CurrentPerson de PersonHolder – mostrando los datos del mismo:

<Grid>
    <StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
        <TextBlock Text="{Binding Id}" />
        <TextBlock Text="{Binding Name}" />            
    </StackPanel>        
</Grid>

Así a la pregunta: ¿Cómo puedo dar a la StackPanel un fondo verde cuando el CurrentPerson tiene un Id la coincidencia de la ActiveId de la PersonHolder (sí, muy útil, pero esto es sólo una forma extremadamente simplificada ejemplo..). Mi opinión es que esto es algo que uno utiliza un disparador para el, pero puedo usar los enlaces en mi condición de disparo valor? Si es así yo podría hacer algo como esto:

<Grid x:Name="Foo">
    <StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
        <TextBlock Text="{Binding Id}" />
        <TextBlock Text="{Binding Name}" />
        <StackPanel.Triggers>
            <DataTrigger Binding="{Binding Id}" Value="{Binding ElementName=Foo, Path=ActiveId}">
                <Setter TargetName="PersonPanel" Property="Background" Value="Green" />
            </DataTrigger>
        </StackPanel.Triggers>
    </StackPanel>        
</Grid>

Pero esto no funciona. ¿Cómo puedo solucionar esto?

InformationsquelleAutor stiank81 | 2010-02-10

1 Comentario

  1. 35

    Usted no puede usar un enlace en el Valor de la propiedad, pero usted puede evitar esto mediante el uso de un MultiBinding y un IMultiValueConverter. Yo definiría mi Trigger en un Style, por ejemplo, en la Ventana.Recursos, lo que le daría algo como esto:

    <Window.Resources>
        <local:SomeMultiConverter x:Key="someMultiConverter" />
        <Style x:Key="someStyle" TargetType="StackPanel">
            <Setter Property="StackPanel.Background" Value="Red" />
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource someMultiConverter}">
                            <Binding Path="Id"></Binding>
                            <Binding ElementName="Foo" Path="DataContext.ActiveId"></Binding>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="StackPanel.Background" Value="Green" />
                </DataTrigger>
            </Style.Triggers>
        </Style> 
    </Window.Resources>
    <Grid x:Name="Foo">
        <StackPanel DataContext="{Binding CurrentPerson}" Style="{StaticResource someStyle}" >
            <TextBlock Text="{Binding Id}" />
            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </Grid>

    Ver en este enlace para un ejemplo en MultiBinding y IMultiValueConverter. Son bastante fáciles de escribir.

Dejar respuesta

Please enter your comment!
Please enter your name here