XAML中x:XData指令元素的妙用

weikeni19 2017-04-20 10:16:27
以下是XAML代码:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<XmlDataProvider x:Key="InventoryData" XPath="Supermarket">
<x:XData>
<Supermarket xmlns="" Name="Supermarket">
<Fruits Name="Fruits">
<Fruit Name="Peach"/>
<Fruit Name="Banana"/>
<Fruit Name="Orange"/>
</Fruits >
<Drinks Name="Drinks">
<Drink Name="Coca Cola"/>
<Drink Name="PEPSI Cola"/>
</Drinks>
</Supermarket>
</x:XData>
</XmlDataProvider>
<HierarchicalDataTemplate x:Name="dongjing" x:Key="xmltemplate" ItemsSource="{Binding}">
<TextBlock Text="{Binding XPath=@Name}"></TextBlock>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView x:Name="tv" Loaded="tv_Loaded_1" >

</TreeView>
</Grid>
</Window>



以下是C#后台代码非常经典 废话不多说 请看:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApplication1;

namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void tv_Loaded_1(object sender, RoutedEventArgs e)
{
XmlDataProvider source = this.FindResource("InventoryData") as XmlDataProvider;
Binding binding = new Binding();
binding.Source = source;
tv.SetBinding(TreeView.ItemsSourceProperty, binding);
HierarchicalDataTemplate liweike = this.FindResource("xmltemplate") as HierarchicalDataTemplate;
tv.ItemTemplate = liweike;

My dd = new My(tv);
}
}
class My : TreeView
{
TreeView dd;
public My()
{}
public My(TreeView a)
{
dd = a;
}
public void liweike()
{
My ddd = new My();
dd = ddd;
((My)dd).GetContainerForItemOverride();
}


}
}
...全文
205 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weikeni19 2017-04-22
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 weikeni19 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
我更正一下 上面的XAML代码 会自动调用ItemsControl里的GetContainerForItemOverride 方法 () 因为GetContainerForItemOverride()方法是protected类型的 是吗?[/quote] 是,不要太纠结这个。[/quote] 有一个遗漏的问题 我问一下 我划红的Binding 绑定的是什么 ? 空绑定啊?能给我解释一下吗?谢谢了 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <XmlDataProvider x:Key="InventoryData" XPath="Supermarket"> <x:XData> <Supermarket xmlns="" Name="Supermarket"> <Fruits Name="Fruits"> <Fruit Name="Peach"/> <Fruit Name="Banana"/> <Fruit Name="Orange"/> </Fruits > <Drinks Name="Drinks"> <Drink Name="Coca Cola"/> <Drink Name="PEPSI Cola"/> </Drinks> </Supermarket> </x:XData> </XmlDataProvider> <HierarchicalDataTemplate x:Key="xmltemplate" ItemsSource="{Binding}"> <TextBlock Text="{Binding XPath=@Name}"></TextBlock> </HierarchicalDataTemplate> </Window.Resources> <Grid> <TreeView x:Name="tv" ItemsSource="{Binding Source={StaticResource ResourceKey=InventoryData}}" ItemTemplate="{StaticResource ResourceKey=xmltemplate}"> </TreeView> </Grid> </Window>
weikeni19 2017-04-21
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
对 好像有点多此一举
exception92 2017-04-21
  • 打赏
  • 举报
回复
My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
weikeni19 2017-04-21
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 weikeni19 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
我更正一下 上面的XAML代码 会自动调用ItemsControl里的GetContainerForItemOverride 方法 () 因为GetContainerForItemOverride()方法是protected类型的 是吗?[/quote] 是,不要太纠结这个。[/quote] xiexie
exception92 2017-04-21
  • 打赏
  • 举报
回复
引用 4 楼 weikeni19 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
我更正一下 上面的XAML代码 会自动调用ItemsControl里的GetContainerForItemOverride 方法 () 因为GetContainerForItemOverride()方法是protected类型的 是吗?[/quote] 是,不要太纠结这个。
weikeni19 2017-04-21
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
我更正一下 上面的XAML代码 会自动调用ItemsControl里的GetContainerForItemOverride 方法 () 因为GetContainerForItemOverride()方法是protected类型的 是吗?
weikeni19 2017-04-21
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
My 既然继承自TreeView, 又传了一个TreeView 进去,这显然不是什么妙处。 如果想获取相同的数据结构,绑定相同的ItemsSource 与ItemTemplate 就行了。
问一下 下面这段XAML代码它会自动调用TreeView里的GetContainerForItemOverride()这个方法是吗? <Grid> <TreeView Name="myTreeViewEvent" > <TreeViewItem Header="Employee1" IsSelected="True"> <TreeViewItem Header="Jesper Aaberg"/> <TreeViewItem Header="Employee Number"> <TreeViewItem Header="12345"/> </TreeViewItem> <TreeViewItem Header="Work Days"> <TreeViewItem Header="Monday"/> <TreeViewItem Header="Tuesday"/> <TreeViewItem Header="Thursday"/> </TreeViewItem> </TreeViewItem> <TreeViewItem Header="Employee2"> <TreeViewItem Header="Dominik Paiha"/> <TreeViewItem Header="Employee Number"> <TreeViewItem Header="98765"/> </TreeViewItem> <TreeViewItem Header="Work Days"> <TreeViewItem Header="Tuesday"/> <TreeViewItem Header="Wednesday"/> <TreeViewItem Header="Friday"/> </TreeViewItem> </TreeViewItem> </TreeView> </Grid>

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧