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

时间:2014-05-29 19:01:52

标签: c# wpf xaml data-binding itemscontrol

我有ObservableCollection<string>绑定到ItemsControl,其模板只是Button。此按钮的内容为2 TextBlock。我尝试使用按钮的PreviewMouseRightButtonUp事件来切换其中一个文本块的可见性,但无法使用模板中的元素的xaml名称进入墙。有没有办法在该预览事件中通过sender获取按钮的内容元素,或者其他一些方法?这与previous question有关,我没有得到可用的答案(可能是由于我的解释,因此这个简化的例子)。在我看来,应该发生的事情是我应该为基于按钮添加一个属性来为这个切换添加一个属性,但这基本上是我想到的我在之前的问题中没有&#39;工作。我觉得这是一个属性,触发器是大多数人会说的正确方法吗?

XAML:

<ItemsControl x:Name="iC" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button PreviewMouseRightButtonUp="Button_PreviewMouseRightButtonUp">
                <DockPanel>
                    <TextBlock Text="normal" DockPanel.Dock="Top"/>
                    <TextBlock Text="{Binding}" DockPanel.Dock="Top" Visibility="Collapsed"/>
                </DockPanel>
            </Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
代码背后的代码:

ObservableCollection<string> x = new ObservableCollection<string>();
public MainWindow()
{
    x.Add("1");
    x.Add("2");
    InitializeComponent();
    iC.ItemsSource = x;
}

1 个答案:

答案 0 :(得分:1)

如果您将隐藏文本块命名为“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截图。但是这些多个实例都可以;它们没有任何负面影响。

screen shot