Создание образца данных XML для Blend из модели данных Entity Framework - PullRequest
0 голосов
/ 16 сентября 2009

При работе с MS Expression Blend вы можете импортировать образцы данных из файла XML, чтобы использовать их для тестирования XAML и привязок в режиме разработки. Моя модель данных полностью определена в XML с использованием Entity Framework. Есть ли какой-либо разумный способ использовать эту модель, прямо или косвенно, в качестве источника для данных выборки Blend? Кажется, это довольно очевидный вариант использования, но я не нашел примеров того, как это сделать. Является ли мой единственный вариант написания утилиты, которая сериализует экземпляр моих классов EF в XML?

(Я не думаю, что смогу использовать ссылку на живой источник данных, потому что я использую Silverlight с WCF, и моя модель данных - это автоматически генерируемые прокси-классы. Если есть способ подключить Blend Служба WCF, я еще не нашел ее - хотя я был бы рад получить несколько указателей.)

1 Ответ

0 голосов
/ 25 сентября 2009

У меня все еще нет хорошего ответа на это. Я попытался сериализовать некоторые экземпляры моих классов EF в XML с помощью DataContractSerializer:

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-нотацию, что, по-видимому, сбивает с толку упрощенный десериализатор XML Blend.

Я также попытался сгенерировать образцы данных вручную (uggh), используя объектную нотацию XAML:

<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>

Так что это мой текущий подход. Не очень элегантно Открыты для других идей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...