Как связать свойство класса XmlDataProvider с XAML TreeView
Я хотел бы связать элемент управления TreeView, который я определил в XAML, со свойством в его классе code-behind. Я уже прочитал часто задаваемые вопросы по связыванию базовых данных WPF, но пример в комментариях в самом низу страницы не сработал, когда я попытался использовать XmlDataProvider в качестве источника привязки.
Как я могу изменить следующий код так, чтобы привязка была определена в XAML, а не в конструкторе класса? Другими словами, как я могу изменить TreeView ItemsSource
атрибут для ссылки на свойство в его классе code-behind?
SomeClass.xaml - Работает
<UserControl x:Class="SomeNamespace.SomeClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<XmlDataProvider x:Key="SomeTreeData" />
</UserControl.Resources>
<TreeView Name="SomeTree" ItemsSource="{Binding Source={StaticResource SomeTreeData}, XPath=*}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="items" ItemsSource="{Binding XPath=*}">
<TextBlock Text="{Binding XPath=@Header}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="item" ItemsSource="{Binding XPath=*}">
<TextBlock Text="{Binding XPath=@Header}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</UserControl>
SomeClass.xaml.cs - Работы
public partial class SomeClass : UserControl
{
public SomeClass()
{
InitializeComponent();
XmlDataProvider lSomeTreeData
= this.FindResource("SomeTreeData") as XmlDataProvider;
lSomeTreeData.Document = new XmlDocument();
lSomeTreeData.Document.LoadXml("<items xmlns=\"\" Header=\"Some items\"><item Header=\"Some item\" /></items>");
}
}
SomeClass.xaml - Желаемый
Обратите внимание {SOME MAGIC}
в TreeView ItemsSource
приписывать.
<UserControl x:Class="SomeNamespace.SomeClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TreeView Name="SomeTree" ItemsSource="{Binding Source={SOME MAGIC}, XPath=*}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="items" ItemsSource="{Binding XPath=*}">
<TextBlock Text="{Binding XPath=@Header}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="item" ItemsSource="{Binding XPath=*}">
<TextBlock Text="{Binding XPath=@Header}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</UserControl>
SomeClass.xaml.cs - Желаемый
public partial class SomeClass : UserControl
{
public XmlDataProvider SomeXmlDataProvider { get; set; }
public SomeClass()
{
InitializeComponent();
this.SomeXmlDataProvider = new XmlDataProvider();
this.SomeXmlDataProvider.Document = new XmlDocument();
this.SomeXmlDataProvider.Document.LoadXml("<items xmlns=\"\" Header=\"Some items\"><item Header=\"Some item\" /></items>");
}
}
1 ответ
Решение
Я обнаружил, что одним из вариантов является установка элемента управления DataContext
:
<UserControl x:Class="SomeNamespace.SomeClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TreeView ItemsSource="{Binding XPath=/items}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="items" ItemsSource="{Binding XPath=*}">
<TextBlock Text="{Binding XPath=@Header}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="item" ItemsSource="{Binding XPath=*}">
<TextBlock Text="{Binding XPath=@Header}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</UserControl>
public partial class SomeClass : UserControl
{
public XmlDataProvider SomeXmlDataProvider { get; set; }
public SomeClass()
{
InitializeComponent();
this.SomeXmlDataProvider = new XmlDataProvider();
this.SomeXmlDataProvider.Document = new XmlDocument();
this.SomeXmlDataProvider.Document.LoadXml("<items Header=\"Some items\"><item Header=\"Some item\" /></items>");
this.DataContext = this.SomeXmlDataProvider.Document;
}
}