У меня есть DataTemplate
, определяемый следующим образом
<DataTemplate x:Key="PasswordViewerTemplate">
<StackPanel>
<TextBlock Text="{Binding PasswordChar, ElementName=this}"
Visibility="Visible" />
<TextBox Text="{Binding PasswordText}"
Visibility="Collapsed" />
</StackPanel>
</DataTemplate>
Я хочу иметь возможность переключать видимость TextBlock
и TextBox
каждый раз, когда пользователь нажимает на StackPanel
.Я попытался установить обработчик событий MouseLeftButtonUp
на StackPanel
, но это вызывает исключение
Object reference not set to an instance of an object
Есть ли другой способ добиться этого?Может быть, в самом XAML используются триггеры?
Также это может быть актуально.Приведенный выше шаблон является одним из двух, который применяется к ListBox
селектором шаблона.Сам ListBox
находится внутри Grid
, и оба шаблона определены в разделе Grid.Resources
.
РЕДАКТИРОВАТЬ 1 Я попытался установить событие следующим образом
<StackPanel MouseLeftButtonUp="OnPasswordViewerMouseLeftButtonUp">
...
</StackPanel>
private void OnPasswordViewerMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var sp = sender as StackPanel;
if( ( sp == null ) || ( sp.Children.Count != 2 ) ) {
return;
}
var passwordText = sp.Children[0] as TextBlock;
var plainText = sp.Children[1] as TextBox;
if( ( passwordText == null ) || ( plainText == null ) ) {
return;
}
passwordText.Visibility = ( passwordText.Visibility == Visibility.Visible ) ?
Visibility.Collapsed : Visibility.Visible;
plainText.Visibility = ( plainText.Visibility == Visibility.Visible ) ?
Visibility.Collapsed : Visibility.Visible;
}