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

时间:2015-06-13 22:22:44

标签: c# wpf xaml

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

<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名称,以便我可以使用其DataContext。

每个tabitem都有不同的Context,我想得到它,取决于按钮的名称。

2 个答案:

答案 0 :(得分:0)

试试这个

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;
        }
    }


}
​

答案 1 :(得分:0)

从您的问题中不清楚您要实现的目标,因此我会做出一些假设。

我认为你想获得按下按钮的TabItem的DataContext,但你将所有按钮绑定到同一个点击事件处理程序。

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

整个TabControl将拥有自己的ViewModel,它的每个TabItem(或项集合)都有一个属性。其中每个都是ViewModel,并且将绑定到每个标签项的“内容”部分。

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

绑定每个按钮时,您将绑定到ViewModel上的ICommand,它也恰好是当前选项卡的Context。

这似乎有点矫枉过正,但从长远来看会使事情变得更简单。