2009-05-27 10 views
22

Quando provo a compilare il seguente codice, ottengo l'errore Il membro "Visibility" non è valido perché non ha un nome di tipo qualificante.Come posso modificare la visibilità di un TextBlock con un trigger?

Cosa devo modificare in modo che sia possibile far scomparire TextBlock quando Status = off?

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> 

Codice Dietro:

using System.Windows; 

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

     public string Status { get; set; } 

    } 
} 

ho cambiato in DataTrigger e le proprietà di dipendenza e si ottiene lo stesso errore:

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> 

Codice Dietro:

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 


    } 
} 

ho rifatto questo con un ViewModel che ha uno status di proprietà che implementa INotifyPropertyChanged, e si ottiene lo stesso errore:

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 
    } 
} 

Codice Dietro:

using System.Windows; 

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

    } 
} 

Sicuramente c'è un modo per fare questo con un trigger in qualche modo.

risposta

0

Forse è necessario implementare INotifyPropertyChanged e aumentare PropertyChange quando lo stato cambia?

Invece di utilizzare un trigger, è possibile utilizzare un convertitore tra Visibility e la stringa di stato.

+0

io voto per l'utilizzo di un convertitore. – gcores

+0

quindi il mio convertitore prenderebbe una stringa (stato) e restituirebbe una visibilità della proprietà? o intendi restituire l'intero elemento? come sarebbe implementato nel codice? –

+0

Ho anche reimplementato questo con un ViewModel (codice sopra) e ottiene lo stesso errore. –

0

Per Bind utilizzare DataTrigger, per le proprietà è possibile utilizzare Trigger .. Assicurarsi inoltre che la proprietà Status informi;) O renderla una proprietà di dipendenza o utilizzare l'interfaccia INotifyPropertyChanged.

DataTrigger on MSDN

Nice article how to combine all these trigger goodness

+0

Ottiene lo stesso errore con DataTrigger e una Dependency Property (codice pubblicato sopra). –

+0

Il mio codice sembra essere implementato allo stesso modo di quell'articolo, semplicemente un DataTrigger, che si lega a una proprietà, solo che usa uno stile ma che non dovrebbe fare alcuna differenza. –

+0

Ho anche reimplementato questo con un ViewModel (codice sopra) e ottiene lo stesso errore. Deve essere qualcosa con XAML, ho davvero bisogno di un EventTrigger? Tutti gli esempi di codice (come quello che hai fornito) usano semplicemente DataTrigger e si collegano alla proprietà che vogliono controllare. –

59

è necessario specificare il tipo su cui deve essere impostata la visibilità

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

Perché a volte funziona senza il nome del tipo? Come ... Questo confonde ... –

+1

Perché Microsoft, ecco perché. – Eternal21

+0

Un 'DependencyObject' può" nascondere "una' DependencyProperty' sulla classe genitore con uno con lo stesso nome, ma devono avere nomi univoci nel dizionario. In questo caso, "FrameworkElement". fa parte della chiave del dizionario, che è ciò di cui hai bisogno per fare riferimento. – Grault

2

Trigger di un elemento supportare solo EventTrigger quindi non è possibile utilizzare i trigger di proprietà (trigger). Aspetto FrameworkElement.Triggers Proprietà.

6

provare qualcosa di simile:

<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> 
Problemi correlati