Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Silverlight 4 редактирование файла на хосте


Автор: ad12 12.1.2011, 16:36
Добрый день.
VS2010, Silverlight 4 браузерное приложение.

На моём хосте имеется файл 1.xml 
//Открываю поток для чтения с помощью WebClient
Uri url = new Uri("Statistic.xml", UriKind.Relative);
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
client.OpenReadAsync(url);

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
   using (Stream s = e.Result)
   {
       XDocument xdoc = XDocument.Load(s);
   }

   // создаю коллекцию    
   records = new ObservableCollection<TDBInfo>();

   // наполняю её значениями атрибутов считанного XML
   …
   …

   // затем отображаю коллекцию в моих DataGrid и DataForm (из Silverlight Tools)
   myDataGrid.ItemsSource = records;
   myDataForm.ItemsSource = records;   
  
}

   // Теперь вручную редактирую поля в myDataForm

Подскажите, пожалуйста – как сохранить отредактированные значения полей в соответствующие значения атрибутов исходного 1.xml (на моём хосте)?
Не могу найти простого метода для сохранения.
Если использовать client.OpenWriteAsync(), то, как я понимаю,
придётся писать ещё серверный обработчик типа CGI или ISAPI расширения.
Неужели в Silverlight 4 нет какого-нибудь метода попроще?

Автор: jonie 12.1.2011, 20:43
Silverlight это клиентское приложение. С тем же успехом вы могли бы просить сделать javascript кодера в коде html запись файла. Без серверных вещей вам ничего не удастся.

В аттаче пример как это сделать.
По шагам.
0) создали DTO сущьность DBItem.cs
1) добавили в стандартную заглушку в web проект WCF Silverlight enabled Serice
2) вписали в него логику загрузки и сохранения коллекции dbitem-ов. Указали для нас что сервис есть синглетон (чтоб данные хранил в сессии) между вызовами Load\save:
Код

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

3) пересобрали проект
4) добавили Add ServiceReference в SL Проект
5) пересобрали проект
6) открыли форму в режиме редактирования визуального
7) перешли на окно Data Source
8) пошли пить чай (это окно будет тупить достаточно долго).
9) перетащили из окна DataSource грид в окно
10) вписали в code файл окна: 
Код


//метод сгенерировала студия
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            ReloadData();
        }

        private void ReloadData()
        {
            // Do not load your data at design time.
            if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
            {
                //Load your data here and assign the result to the CollectionViewSource.
                ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
                client.GetListCompleted += new EventHandler<ServiceReference1.GetListCompletedEventArgs>(client_GetListCompleted);
                client.GetListAsync();
            }
        }

        void client_GetListCompleted(object sender, ServiceReference1.GetListCompletedEventArgs e)
        {
            System.Windows.Data.CollectionViewSource myCollectionViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["dBItemViewSource"];
            myCollectionViewSource.Source = e.Result;
            MessageBox.Show("LOADED!");
        }

        private void SaveBtn_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Data.CollectionViewSource myCollectionViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["dBItemViewSource"];
            var collection = myCollectionViewSource.Source as ObservableCollection<ServiceReference1.DBItem>;
            ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
            client.SaveListCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_SaveListCompleted);
            client.SaveListAsync(collection);
        }

        void client_SaveListCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            MessageBox.Show("SAVED!");
            ReloadData();
        }


добавили кнопку на окно и привязали её Click делегат к SaveBtn_Click.
Где в коде разметки студия также сгенила:
Код

    <UserControl.Resources>
        <CollectionViewSource x:Key="dBItemViewSource" d:DesignSource="{d:DesignInstance my:DBItem, CreateList=True}" />
    </UserControl.Resources>


запускаем. Радуемся (ну или огорчаемся что там всё сложно)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)