2008-09-18 22 views
28

Tengo el siguiente XAML:WPF DataTrigger no disparar cuando se esperaba

<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/> 
<TextBlock Text="items selected"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1"> 
        <Setter Property="TextBlock.Text" Value="item selected"></Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

El primer bloque de texto cambia felizmente con SelectedItems.Count, mostrando 0,1,2, etc. El DataTrigger en el segundo bloque nunca parece disparar para cambiar el texto.

¿Alguna idea?

+1

Ya sabes, no tengo idea de por qué esto sigue recibiendo votos a la baja - es una pregunta legítima. Si bajas tu voto, al menos deja un comentario por qué. –

+1

Eso es extraño, enviando un voto a su favor – viggity

+0

Puede ser el título vago, pero este es un problema común con DataTriggers y este es un buen ejemplo, +1 –

Respuesta

13

El DataTrigger se activa pero el campo de texto para su segundo TextBlock está codificado como "elementos seleccionados" por lo que no podrá cambiar. Para verlo disparar, puede eliminar Texto = "elementos seleccionados".

Su problema es un buen candidato para el uso de un ValueConverter en lugar de DataTrigger. A continuación, le mostramos cómo crear y utilizar ValueConverter para que configure el texto a su gusto.

Cree este ValueConverter:

public class CountToSelectedTextConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((int)value == 1) 
      return "item selected"; 
     else 
      return "items selected"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

agregar la referencia de espacio de nombres a su el montaje del convertidor se encuentra:

xmlns:local="clr-namespace:ValueConverterExample" 

Agregar el convertidor de sus recursos:

<Window.Resources> 
    <local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/> 
</Window.Resources> 

Cambiar el segundo bloque de texto a:

<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/> 
+0

Tienes razón, quitando el texto trabajado. Voy a ir con los elementos seleccionados para el texto, ya que no tengo ganas de crear un convertidor completo para esto. Sin embargo, estoy marcando esto como una respuesta aceptada porque funcionaría. –

+1

¿Qué tal si necesitabas el disparador de datos para controlar un guión gráfico? Un convertidor no es apropiado en ese escenario. ¿Algún consejo? – Gusdor

28

Como alternativa, puede reemplazar su XAML con esto:

<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/> 
<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Text" Value="items selected"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1"> 
        <Setter Property="Text" Value="item selected"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

convertidores pueden resolver muchos problemas vinculante, pero que tiene una gran cantidad de convertidores especializados se pone muy sucio

+0

¡Gracias, su respuesta resolvió mi problema! –

+0

Gracias, una solución simple a un error de diseño/restricción muy estúpido/Micro $ oft irritación impuesta. – Xtr

Cuestiones relacionadas