取元素的父名称,比上几个级别

本文关键字:几个 元素 | 更新日期: 2023-09-27 17:56:08

我的 MainWindow.xaml 中有很多 Tabitems.cs它们都具有相同的结构。这是其中之一。

<TabItem Name="tabFeatured" Header="Featured" DataContext="{Binding TemplatesFeatured}">
            <ScrollViewer>
                <ItemsControl Name="ItemsControlFeatured" ItemsSource="{Binding}" >
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Button 
                                Name="Featured"
                                Tag="{Binding Id}"
                                Click="Button_Download_Click">
                            </Button>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </ScrollViewer>
        </TabItem>

这是来自 C#

private void Button_Download_Click(object sender, RoutedEventArgs e)
{
    Button b = (Button)sender;
    string buttonTag = b.Tag.ToString();
    string categoryName = b.Name.ToLower();
}

如何获取单击按钮的 TabItem 名称,以便可以使用其数据上下文。

每个选项卡项都有不同的上下文,我想获取它,取决于按钮的名称。

取元素的父名称,比上几个级别

从你的问题中还不清楚你想实现什么,所以我会做一些假设。

我认为您希望获取按下按钮的 TabItem 的数据上下文,但您将所有按钮绑定到同一个单击事件处理程序。

如果我走在正确的轨道上,可以使用 MVVM 模式简化其中一些问题。有关将每个 TabItem 内容分解为其自己的视图和视图模型的说明,请参阅此处。

整个 TabControl 将具有自己的 ViewModel,该模型将为其每个 TabItems (或项集合) 提供一个属性。其中每个都将是一个视图模型,并将绑定到每个选项卡项的"内容"部分。

您将在每个视图模型及其视图之间设置数据上下文映射,实际上在您看到此视图模型呈现该视图时告诉 WPF。

当您绑定这些按钮中的每一个时,您将绑定到 ViewModel 上的 ICommand,这也恰好是当前选项卡的上下文。

这可能看起来有点矫枉过正,但从长远来看会让事情变得简单。

试试这个

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Featured.Click += new EventHandler(Button_Download_Click);
            button2.Click += new EventHandler(Button_Download_Click);
            button3.Click += new EventHandler(Button_Download_Click);
        }
        string XML =
            "<Root>'n" +
            "<TabItem Name='"tabFeatured'" Header='"Featured'" DataContext='"{Binding TemplatesFeatured}'">'n" +
               "<ScrollViewer>'n" +
                   "<ItemsControl Name='"ItemsControlFeatured'" ItemsSource='"{Binding}'">'n" +
                        "<ItemsControl.ItemsPanel>'n" +
                             "<ItemsPanelTemplate>'n" +
                                  "<WrapPanel/>'n" +
                             "</ItemsPanelTemplate>'n" +
                        "</ItemsControl.ItemsPanel>'n" +
                        "<ItemsControl.ItemTemplate>'n" +
                           "<DataTemplate>'n" +
                              "<Button Name='"Featured'" Tag='"{Binding Id}'" Click='"Button_Download_Click'"></Button>'n" +
                           "</DataTemplate>'n" +
                        "</ItemsControl.ItemTemplate>'n" +
                   "</ItemsControl>'n" +
                "</ScrollViewer>'n" +
            "</TabItem>'n" +
            "<TabItem Name='"tabFeatured'" Header='"Featured'" DataContext='"{Binding TemplatesFeatured}'">'n" +
               "<ScrollViewer>'n" +
                   "<ItemsControl Name='"ItemsControlFeatured'" ItemsSource='"{Binding}'">'n" +
                        "<ItemsControl.ItemsPanel>'n" +
                             "<ItemsPanelTemplate>'n" +
                                  "<WrapPanel/>'n" +
                             "</ItemsPanelTemplate>'n" +
                        "</ItemsControl.ItemsPanel>'n" +
                        "<ItemsControl.ItemTemplate>'n" +
                           "<DataTemplate>'n" +
                              "<Button Name='"xxxx'" Tag='"{Binding Id}'" Click='"Button_Download_Click'"></Button>'n" +
                           "</DataTemplate>'n" +
                        "</ItemsControl.ItemTemplate>'n" +
                   "</ItemsControl>'n" +
                "</ScrollViewer>'n" +
            "</TabItem>'n" +
            "</Root>'n";
        private void Button_Download_Click(object sender, EventArgs e)
        {
            var button = sender as Button;
            string buttonName = button.Name;
            XDocument doc = XDocument.Parse(XML);
            List<XElement> TabItems = doc.Descendants("TabItem").ToList();
            var xmlButton = TabItems.Select(x => x).Where(y => y.Descendants("Button").FirstOrDefault().Attribute("Name").Value == buttonName).FirstOrDefault().Attribute("Name").Value;
        }
    }

}
​