次のコードをコンパイルしようとすると、エラーが発生します'Visibility'メンバーは、修飾型名がないため無効です。
ステータス=オフのときにTextBlockを非表示にするできるようにするには、何を変更する必要がありますか?
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とDependencyPropertiesに変更しましたが、同じエラーが発生します。
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
}
}
INotifyPropertyChangedを実装するプロパティStatusを持つViewModelでこれをやり直したところ、同じエラーが発生します。
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;
}
}
}
確かに、何らかの方法でトリガーを使用してこれを行う方法があります。
可視性を設定するタイプを指定する必要があります
<Setter Property="FrameworkElement.Visibility" Value="Visible"/>
次のようなものを試してください。
<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>
要素のトリガーはEventTriggerのみをサポートするため、プロパティトリガー(トリガー)を使用することはできません。 FrameworkElement.Triggersプロパティを見てください。
たぶん、ステータスが変更されたときにINotifyPropertyChangedを実装し、PropertyChangeを発生させる必要がありますか?
トリガーを使用する代わりに、VisibilityとStatus文字列の間のコンバーターを使用できます。
バインディングにはDataTriggerを使用し、プロパティにはTriggerを使用できます。また、Statusプロパティが通知することを確認してください;)依存プロパティにするか、INotifyPropertyChangedインターフェイスを使用してください。