我的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,我想得到它,取决于按钮的名称。
答案 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。
这似乎有点矫枉过正,但从长远来看会使事情变得更简单。