取元素的父名称,比上几个级别
本文关键字:几个 元素 | 更新日期: 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;
}
}
}