我有一个用户控件,它以编程方式设置列表框的数据源(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文档。
- 我在这个应用程序中所做的大部分都是我在谷歌中理解的点点滴滴,所以请原谅我。
老实说,我无法理解如果你是一个新的编码实践加载WPF UI,但很少的事情看起来像错过…
-
您的
ListBox.ItemsSource
被绑定为{Binding}
,即绑定到整个视图的DataContext
,但在您的代码后面没有任何地方,您是否设置了视图的DataContext
或ListBox的任何更高级别的父级。 -
您的
templateBinding
变量在创建后不会在任何地方使用。 -
为什么在您的
LoadContents
方法结束时再次设置FormDataProvider
和FormTemplate
?如果你想"刷新"你的Resources
字典,那么这不是正确的方式。
为了刷新你的Resources
,你需要在Resources
字典中删除和添加资源,同时使用DynamicResource
标记参考。
让我知道你到底想要实现什么。