2009-05-27 3 views
22

Когда я пытаюсь скомпилировать следующий код, я получаю сообщение об ошибке Недопустимый член «Видимость», поскольку он не имеет имени типа квалификации.Как изменить видимость текстового блока с помощью триггера?

Что мне нужно изменить, чтобы я мог отключить TextBlock, когда 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> 

Код За:

using System.Windows; 

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

     public string Status { get; set; } 

    } 
} 

я изменил DataTrigger и свойства зависимостей, и он получает ту же ошибку:

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> 

Код За:

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 


    } 
} 

я переделал это с ViewModel, который имеет статус собственности, реализующий INotifyPropertyChanged, и он получает ту же самую ошибку:

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

Код За:

using System.Windows; 

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

    } 
} 

Конечно, есть способ сделать это с помощью триггера каким-то образом.

ответ

0

Возможно, вам нужно реализовать INotifyPropertyChanged и поднять PropertyChange при изменении статуса?

Вместо использования триггера вы можете использовать Конвертер между видимостью и строкой состояния.

+0

Я голосую за помощью конвертера. – gcores

+0

, поэтому мой конвертер примет строку (статус) и вернет видимость свойства? или вы хотите вернуть весь элемент? как это будет реализовано в коде? –

+0

Я также переопределил это с помощью ViewModel (код выше) и получил ту же ошибку. –

0

Для привязок используйте DataTrigger, для свойств, которые вы можете использовать Trigger. Также убедитесь, что свойство состояния уведомляет;) Либо сделайте это свойство зависимости, либо используйте интерфейс INotifyPropertyChanged.

DataTrigger on MSDN

Nice article how to combine all these trigger goodness

+0

Он получает ту же ошибку с DataTrigger и свойством зависимостей (размещен код выше). –

+0

Мой код, похоже, реализован так же, как и эта статья, просто DataTrigger, привязанный к свойству, просто использует стиль, но это не должно иметь никакого значения. –

+0

Я также переопределил это с помощью ViewModel (код выше) и получил ту же ошибку. Это должно быть что-то с XAML, мне действительно нужен EventTrigger? Все примеры кода (например, предоставленные вами) просто используют DataTrigger и привязывают свойство, которое они хотят проверить. –

59

Вы должны указать тип, на котором видимость должна быть установлена ​​

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

Почему это иногда работает без имени типа? Как ... Это путает ... –

+1

Потому что Microsoft, вот почему. – Eternal21

+0

«DependencyObject» может «скрыть» DependencyProperty в родительском классе с одним и тем же именем, но им нужно иметь уникальные имена в словаре. В этом случае «FrameworkElement». является частью словарного ключа, который вам нужно ссылаться. – Grault

2

Триггеры элемента поддерживают только EventTrigger, так что вы не можете использовать триггеры собственности (Вызывать). Look FrameworkElement.Triggers Property.

6

попробовать что-то вроде этого:

<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> 
Смежные вопросы