在使用MS Expression Blend时,您可以从XML文件导入样本数据,以用于在设计模式下测试XAML和绑定。我的数据模型使用实体框架在XML中完全定义。有没有合理的方法可以直接或间接地使用该模型作为Blend样本数据的来源?看起来这是一个相当明显的用例,但我还没有找到如何做到这一点的任何样本。我唯一的选择是编写一个将我的EF类实例序列化为XML的实用程序吗?
(我认为我不能使用实时数据源的链接,因为我正在使用带有WCF的Silverlight,而我的数据模型是自动生成的代理类。如果有办法将Blend挂钩到一个WCF服务,我还没有找到它 - 虽然我很乐意得到一些指示。)
答案 0 :(得分:0)
我仍然没有一个很好的答案。我尝试使用DataContractSerializer将我的EF类的一些实例序列化为XML:
DataContractSerializer serializer = new DataContractSerializer(typeof(Room));
using (SlideLincEntities ctx = new SlideLincEntities())
{
Room roomWithMostSessions = ctx.Room
.OrderByDescending(r => r.Sessions.Count)
.FirstOrDefault();
string fileName = ConfigurationSettings.AppSettings["outputFile"];
Console.WriteLine("Writing data to file '{0}'", fileName);
File.Delete(fileName);
using (Stream fileStream = File.Open(fileName, FileMode.OpenOrCreate))
{
serializer.WriteObject(fileStream, roomWithMostSessions);
}
}
不幸的是,Blend无法读取生成的XML:DataContractSerializer使用XML引用表示法,这显然会混淆Blend简单的XML反序列化程序。
我还尝试使用XAML的对象表示法手工生成样本数据(uggh):
<rs:Room d:IsDataSource="True"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:rs="clr-namespace:SlideLinc.Client.Common.RoomService;assembly=SlideLinc.Client.Common"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
mc:Ignorable="d"
Name="_default" OwnerId="smithkl42"
>
<rs:Room.Owner>
<rs:RegisteredUser x:Name="ken" UserId="ken" Email="ken@hotmail.com" FirstName="Ken" LastName="Smith" MaxFileUploadSize="20000" UserName="Ken Smith" />
</rs:Room.Owner>
</rs:Room>
这样更好,但由于某种原因,Blend不会绑定到对象中的任何集合:我不知道为什么,因为XAML数据绑定错误当然会被静默吞噬。 (我是否曾提到我有多讨厌XAML数据绑定?)
我最终在XAML表格中直接定义了少量数据:
<ListBox x:Name="fileListBox" Grid.Row="2" Margin="4" BorderThickness="0" >
<ListBox.ItemTemplate>
<DataTemplate>
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="70" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<Image Source="/Images/Word.png" Grid.Column="0" Margin="2" />
<TextBlock Text="{Binding OriginalFileName}" Grid.Column="1" VerticalAlignment="Center" />
<HyperlinkButton Content="Share" Grid.Column="2" Margin="4" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<HyperlinkButton Grid.Column="4" Margin="4" HorizontalAlignment="Right" VerticalAlignment="Center" >
<Image Source="/Images/trashcan.png" Width="25" />
</HyperlinkButton>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<!-- I shouldn't have to do this, but for some reason, I can't get sample data any other way -->
<roomservice:SharedFile OriginalFileName="Some Document.docx" />
<roomservice:SharedFile OriginalFileName="Another document.pptx"/>
</ListBox>
这是我目前的做法。不是很优雅。对其他想法持开放态度。