C# 使用绑定到集合的控件内的元素
我有一个C# 使用绑定到集合的控件内的元素,c#,wpf,xaml,data-binding,itemscontrol,C#,Wpf,Xaml,Data Binding,Itemscontrol,我有一个observateCollection,它绑定到一个ItemsControl,其模板只是一个按钮。此按钮的内容为2TextBlock。我试图使用按钮的PreviewMouseRightButtonUp事件来切换其中一个文本块的可见性,但无法为模板中的元素使用xaml名称,我遇到了麻烦。在预览事件中,是否有通过sender获取按钮内容元素的方法,或者其他方法?这与我的一个问题有关,我没有得到一个很有用的答案(可能是因为我的解释,所以这个简化的例子)。在我看来,我应该做一个基于off按钮的控
observateCollection
,它绑定到一个ItemsControl
,其模板只是一个按钮。此按钮的内容为2TextBlock
。我试图使用按钮的PreviewMouseRightButtonUp
事件来切换其中一个文本块的可见性,但无法为模板中的元素使用xaml名称,我遇到了麻烦。在预览事件中,是否有通过sender
获取按钮内容元素的方法,或者其他方法?这与我的一个问题有关,我没有得到一个很有用的答案(可能是因为我的解释,所以这个简化的例子)。在我看来,我应该做一个基于off按钮的控件,为这个切换添加一个属性,但这基本上是我在上一个问题中认为不起作用的。我觉得一个属性和触发器是什么,大多数人会说是正确的方式去
xaml:
代码隐藏:
ObservableCollection<string> x = new ObservableCollection<string>();
public MainWindow()
{
x.Add("1");
x.Add("2");
InitializeComponent();
iC.ItemsSource = x;
}
ObservableCollection x=新的ObservableCollection();
公共主窗口()
{
x、 添加(“1”);
x、 添加(“2”);
初始化组件();
iC.ItemsSource=x;
}
如果您将隐藏的文本块命名为“secondTextBlock”,那么这应该可以:
private void Button_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
DockPanel dockPanel = (DockPanel)((Button)sender).Content;
TextBlock text = (TextBlock)LogicalTreeHelper.FindLogicalNode(dockPanel, "secondTextBlock");
if (text != null)
{
text.Visibility = Visibility.Visible;
}
}
关于您下面的评论:是的,将创建多个“secondTextBlock”实例。请参见下面的Snoop屏幕截图。但这些多个实例是可以的;它们没有任何负面影响
我尝试过与您类似的代码,在我的例子中,正在调用按钮\u PreviewMouseRightButtonUp()
。您是否向调试器检查了此方法是否确实没有被调用?或者,ItemsControl
的父元素将IsEnabled
设置为false
。不确定是否相同@fmunkert我不是说上面的代码对我不起作用,而是说我应该如何使用预览事件切换其中一个文本块的可见性(或任何其他属性)。您可以在项控件中使用xaml名称?这不会导致创建多个同名文本块吗?我已经回答了你上面的问题。
private void Button_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
DockPanel dockPanel = (DockPanel)((Button)sender).Content;
TextBlock text = (TextBlock)LogicalTreeHelper.FindLogicalNode(dockPanel, "secondTextBlock");
if (text != null)
{
text.Visibility = Visibility.Visible;
}
}