我有一个如下所示的DataTemplate
定义:
<DataTemplate x:Key="PasswordViewerTemplate">
<StackPanel>
<TextBlock Text="{Binding PasswordChar, ElementName=this}"
Visibility="Visible" />
<TextBox Text="{Binding PasswordText}"
Visibility="Collapsed" />
</StackPanel>
</DataTemplate>
我想实现在用户单击 StackPanel 时可以切换 TextBlock 和 TextBox 的可见性。我尝试在 StackPanel 上设置 MouseLeftButtonUp 事件处理程序,但这会抛出一个异常“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;
}
TextBox
而不是TextBlock
吗? - Fredrik HedbladStackPanel
时切换TextBlock
和TextBox
的可见性。 - PraetorianStackPanel
在ListBoxItem
的ItemTemplate
中,所以TextBlock
将决定StackPanel
的大小。这意味着你永远无法直接点击StackPanel
,因为TextBlock
会覆盖它,除非你在ItemContainerStyle
中设置HorizontalContentAlignment
为Stretch
。 - Fredrik HedbladTextBox
可见并且您单击它,您希望发生什么?是否应该切换可见性? - Fredrik HedbladTextBlock
完全覆盖了StackPanel
,但是点击事件不应该冒泡到StackPanel
吗?如果您查看上面的 XAML,最初 TextBlock 是可见的,TextBox 不可见。第一次点击 -> TextBlock 折叠,TextBox 可见。第二次点击 -> TextBlock 可见,TextBox 折叠。以此类推... - Praetorian