我有一个用户控件,它以编程方式设置列表框的数据源(确切地说是 XmlDataProvider 和 DataTemplate),但在运行时它永远不会正确显示。加载用户控件时。数据提供者的所有设置都没有反映。
你能帮我解决这个问题吗?我真的是开发 WPF 应用程序的新手。
TIA
这是代码:
XAML
<UserControl x:Class="ENGAGIAUCL.Views.ImageViewer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="500" Width="550">
<UserControl.Resources>
<XmlDataProvider x:Key="FormDataProvider"/>
<DataTemplate x:Key="FormTemplate">
<Border Background="#2200FF00"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="8"
Margin="2,4,2,4"
Padding="4">
<StackPanel HorizontalAlignment="Stretch">
<TextBlock Text="{Binding XPath=name}" />
</StackPanel>
</Border>
</DataTemplate>
</UserControl.Resources>
<DockPanel>
<Border DockPanel.Dock="Top"
Height="45">
<TextBlock x:Name="tbkContentTitle"
Text="Content Title Goes Here"
VerticalAlignment="Center"
HorizontalAlignment="Center"
FontSize="20">
</TextBlock>
</Border>
<DockPanel>
<Border DockPanel.Dock="Bottom">
</Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox x:Name="lbPreview"
IsSynchronizedWithCurrentItem="True"
VerticalAlignment="Top"
Height="455"
Grid.Column="0"
ItemsSource="{Binding}">
</ListBox>
<Frame x:Name="ActualContentFrame"
Grid.Column="1"
Source="{Binding XPath=url}">
</Frame>
</Grid>
</DockPanel>
</DockPanel>
</UserControl>
这是 .cs 文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 System.Xml;
using EngagiaCL.CommonObjects;
using EngagiaCL.Functions;
namespace ENGAGIAUCL.Views
{
/// <summary>
/// Interaction logic for ImageViewer.xaml
/// </summary>
public partial class ImageViewer : UserControl
{
public ImageViewer()
{
InitializeComponent();
Loaded += (s, e) =>
{
LoadContents();
};
}
#region Methods
private void LoadContents()
{
if (CurrentUser != null)
{
XmlDataProvider provider = (XmlDataProvider)this.FindResource("FormDataProvider");
DataTemplate template = (DataTemplate)this.FindResource("FormTemplate");
Binding templatebinding = new Binding();
provider.Document = CurrentUser.UserDoc;
provider.XPath = GetResourcePath();
template.DataType = (object)GetDataTemplateObject();
Resources["FormDataProvider"] = provider;
Resources["FormTemplate"] = template;
}
}
private string GetResourcePath()
{
string path = string.Empty;
if (ContentType == "ADMIN")
{
path = "/SyncLoginResponse/AdminForms/AdminForm";
}
else
{
path = "/SyncLoginResponse/Forms/Form";
}
return path;
}
private string GetDataTemplateObject()
{
string templateobject = string.Empty;
if (ContentType == "ADMIN")
{
templateobject = "AdminForm";
}
else
{
templateobject = "Form";
}
return templateobject;
}
#endregion
#region Properties
public UserInformation CurrentUser { get; set; }
public string ContentType { get; set; }
#endregion
}
}
这是供参考的xml:
</SyncLoginResponse>
<AdminForms>
<AdminForm>
<name>Best Form Ever/html</name>
<url>
http://blahblahblah/
</url>
</AdminForm>
</AdminForms>
</SyncLoginResponse>
注意事项:
- CurrentUser 是一个在 UserDoc 属性中包含 xml 文档的对象。
- 我在这个应用程序中所做的大部分事情都是我在谷歌搜索中理解的点点滴滴,所以请多多包涵。