2009-05-27 13 views
22

Cuando intento compilar el siguiente código, obtengo el error El miembro 'Visibilidad' no es válido porque no tiene un nombre de tipo calificado.¿Cómo puedo cambiar la visibilidad de un TextBlock con un disparador?

¿Qué debo cambiar para poder hacer que desaparezca el bloque de texto cuando el estado es = apagado?

XAML:

<Window x:Class="TestTrigger123345.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <TextBlock Text="This is a sentence."> 
      <TextBlock.Triggers> 
       <Trigger Property="{Binding Status}" Value="off"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </Trigger> 
      </TextBlock.Triggers> 
     </TextBlock> 
     <TextBlock Text="{Binding Status}"/> 
    </StackPanel> 
</Window> 

código subyacente:

using System.Windows; 

namespace TestTrigger123345 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = this; 
      Status = "off"; 
     } 

     public string Status { get; set; } 

    } 
} 

me cambiaron a DataTrigger y propiedades de dependencia y se pone el mismo error:

XAML:

<Window x:Class="TestTrigger123345.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel HorizontalAlignment="Left"> 
     <TextBlock Text="{Binding Status}"> 
      <TextBlock.Triggers> 
       <DataTrigger Binding="{Binding Status}" Value="off"> 
        <Setter Property="TextBlock.Background" Value="Tan"/> 
       </DataTrigger> 
      </TextBlock.Triggers> 
     </TextBlock> 
    </StackPanel> 
</Window> 

código subyacente:

using System.Windows; 

namespace TestTrigger123345 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = this; 
      Status = "off"; 
     } 

     #region DependencyProperty: Status 
     public string Status 
     { 
      get 
      { 
       return (string)GetValue(StatusProperty); 
      } 
      set 
      { 
       SetValue(StatusProperty, value); 
      } 
     } 

     public static readonly DependencyProperty StatusProperty = 
      DependencyProperty.Register("Status", typeof(string), typeof(Window1), 
      new FrameworkPropertyMetadata()); 
     #endregion 


    } 
} 

Rehice esto con un modelo de vista que tiene una propiedad de estado que implementa INotifyPropertyChanged, y se pone el mismo error:

WindowViewModel.cs:

using System.ComponentModel; 

namespace TestTrigger123345 
{ 
    class WindowViewModel 
    { 
     #region ViewModelProperty: Status 
     private string _status; 
     public string Status 
     { 
      get 
      { 
       return _status; 
      } 

      set 
      { 
       _status = value; 
       OnPropertyChanged("Status"); 
      } 
     } 
     #endregion 

     #region PropertChanged Block 
     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 
     #endregion 
    } 
} 

código subyacente:

using System.Windows; 

namespace TestTrigger123345 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      WindowViewModel windowViewModel = new WindowViewModel(); 
      windowViewModel.Status = "off"; 
      DataContext = windowViewModel; 
     } 

    } 
} 

Seguramente hay una manera de hacer esto con un disparador de alguna manera.

Respuesta

0

Quizás necesite implementar INotifyPropertyChanged y subir PropertyChange cuando cambie el estado?

En lugar de utilizar un activador, puede usar un Conversor entre Visibilidad y su cadena de Estado.

+0

Yo voto por el uso de un convertidor. – gcores

+0

entonces mi convertidor tomaría una cadena (estado) y devolvería una visibilidad de propiedad? o te refieres a devolver todo el elemento? ¿cómo se implementaría eso en el código? –

+0

También reimplementé esto con un ViewModel (código anterior) y obtiene el mismo error. –

0

Para las vinculaciones utilice DataTrigger, para las propiedades que puede utilizar desencadenar ... También asegúrese de que la propiedad de estado notifique;) Haga que sea una propiedad de dependencia o use la interfaz INotifyPropertyChanged.

DataTrigger on MSDN

Nice article how to combine all these trigger goodness

+0

Obtiene el mismo error con DataTrigger y una Propiedad de dependencia (código publicado más arriba). –

+0

Parece que mi código se implementó de la misma manera que ese artículo, simplemente un DataTrigger, vinculante a una propiedad, solo que usa un estilo pero eso no debería hacer ninguna diferencia. –

+0

También reimplementé esto con un ViewModel (código anterior) y obtiene el mismo error. Debe ser algo con el XAML, ¿realmente necesito un EventTrigger? Todos los ejemplos de código (como el que proporcionó) simplemente usan DataTrigger y se enlazan a la propiedad que desean verificar. –

59

es necesario especificar el tipo en el que la visibilidad se debe establecer

<Setter Property="FrameworkElement.Visibility" Value="Visible"/> 
+10

¿Por qué a veces funciona sin el nombre Tipo? Al igual que ... Esto es confuso ... –

+1

Porque Microsoft, es por eso. – Eternal21

+0

Un 'DependencyObject' puede" ocultar "una' DependencyProperty' en la clase principal con uno del mismo nombre, pero deben tener nombres únicos en el diccionario. En este caso, "FrameworkElement". es parte de la clave del diccionario, que es a lo que necesita hacer referencia. – Grault

2

disparadores de un elemento sólo admiten EventTrigger lo que no puede utilizar disparadores de propiedad (Desencadenar). Mire la propiedad FrameworkElement.Triggers.

6

intentar algo como esto:

<PasswordBox Name="pbxPassword" /> 
<TextBox Text="{Binding Password, 
         ElementName=pbxPassword, 
         UpdateSourceTrigger=PropertyChanged}"> 
    <TextBox.Style> 
     <Style TargetType="TextBox"> 
      <Setter Property="Visibility" Value="Hidden" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsChecked, ElementName=chbShowPassword}" Value="True"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger>     
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
<CheckBox Name="chbShowPassword"> 
    Show password 
</CheckBox> 
Cuestiones relacionadas