0

在使用 MS Expression Blend 时,您可以从 XML 文件导入示例数据,以用于在设计模式下测试您的 XAML 和绑定。我的数据模型是使用实体框架在 XML 中完全定义的。是否有任何合理的方式可以直接或间接地使用该模型作为 Blend 样本数据的来源?看起来这是一个相当明显的用例,但我还没有找到任何关于如何做到这一点的示例。编写一个将我的 EF 类的实例序列化为 XML 的实用程序是我唯一的选择吗?

(我认为我不能使用指向实时数据源的链接,因为我使用的是带 WCF 的 Silverlight,而且我的数据模型是自动生成的代理类。如果有办法将 Blend 连接到 WCF 服务,我还没有找到它——尽管我很乐意得到一些指示。)

4

1 回答 1

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>

这就是我目前的方法。不是很优雅。接受其他想法。

于 2009-09-25T07:45:19.883 回答