C# 使用绑定到集合的控件内的元素

C# 使用绑定到集合的控件内的元素,c#,wpf,xaml,data-binding,itemscontrol,C#,Wpf,Xaml,Data Binding,Itemscontrol,我有一个observateCollection,它绑定到一个ItemsControl,其模板只是一个按钮。此按钮的内容为2TextBlock。我试图使用按钮的PreviewMouseRightButtonUp事件来切换其中一个文本块的可见性,但无法为模板中的元素使用xaml名称,我遇到了麻烦。在预览事件中,是否有通过sender获取按钮内容元素的方法,或者其他方法?这与我的一个问题有关,我没有得到一个很有用的答案(可能是因为我的解释,所以这个简化的例子)。在我看来,我应该做一个基于off按钮的控

我有一个
observateCollection
,它绑定到一个
ItemsControl
,其模板只是一个
按钮。此按钮的内容为2
TextBlock
。我试图使用按钮的
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;
    }
}