2009-09-16 1 views
1

Я экспериментирую с .Net RIA и Silverlight, у меня есть несколько связанных объектов; Клиент, проект и работа, клиент имеет много проектов, а в проекте много вакансий.Как установить начальные значения при использовании Silverlight DataForm и .Net RIA Services DomainDataSource?

В приложении Silverlight я использую средства DomainDataSource и DataForm для выполнения операций CRUD. Когда клиент выбран, появляется список проектов, после чего пользователь может добавить новый проект для этого клиента. Я хотел бы иметь возможность автоматически заполнить значение для клиента, но, похоже, нет никакого способа сделать это, хотя есть событие AddingNewItem в элементе управления DataForm, похоже, оно срабатывает до того, как DataForm имеет экземпляр нового объекта, и я не уверен, что трафик через ChangeSet из события DomainDataSource SubmittingChanges - лучший способ сделать это.

Я бы подумал, что это было бы очевидной особенностью ... кто-нибудь знает лучший способ достичь этой функциональности?

+0

TheDuke, вы нашли решение своего вопроса? У меня такая же ситуация: я хотел бы предварительно заполнить некоторый DataField моего окна шаблона NewItem некоторыми данными из определенного DataMontext, определенного XAML. Это может быть из DataGrid или из самого DataForm. Но ни то, ни другое решение, которое я пробовал, не дает мне возможности привязать шаблон NewItem к данным. – AlvinfromDiaspar

+0

Мне не очень повезло с этим, и это был всего лишь личный проект, так что я больше этого не делал. То, что я делал в конце концов, отнюдь не является идеальным решением, но, используя события AddingNewItem и EditEnded DataForm, я сохраняю логическую погоду, которую пользователь добавляет новый элемент, а затем дополнительно в обработчик события EditEnded я обнаруживаю, если пользователь сохраняет новый элемент с использованием этого логического значения и соответствующим образом задайте требуемые значения. Я не тестировал это полностью, и мои свойства DataForms AutoEdit и AutoCommit имеют значение false. – TheDuke

ответ

1

Ну, опоздание на партию, но сталкивается с тем же вопросом, который я реализовал обходной путь с помощью преобразователя значения:

public class MissingDateTimeValueConverter : IValueConverter { 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     if (value is DateTime && (DateTime)value == DateTime.MinValue) { 
      DateTime returnValue = DateTime.Now.Date; 
      int addDays; 
      if (!string.IsNullOrEmpty(parameter as string) && int.TryParse(parameter as string, out addDays)) { 
       returnValue = returnValue.AddDays(addDays); 
      } 
      return returnValue; 
     } else { 
      return value; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     return value;    
    } 

} 

Он переводит значения отсутствующих дат (например, 01.01.0001) до сегодняшней даты и позволяет добавлять/вычитать дни, используя parameter -параметр.

1

Что-то, что обычно делается, это иметь экран, содержащий DataGrid, показывающий существующие данные. Тогда есть кнопка Add, которая будет:

  1. Создать новый элемент
  2. Создать ChildWindow, передавая новый элемент конструктора ChildWindow
  3. Have с DataForm внутри ChildWindow, связанный с элементом указанного
+0

Это заманчивый вариант, хотя мой текущий вид - это основная деталь, у меня уже есть DataForm рядом с DataGrid. У DataForm есть собственный add buttoon, который я использую в настоящее время для добавления записи в базу данных. Я отвечу как полезный, но я не уверен, что это единственный способ добиться этого. Любой вход очень ценится. – TheDuke

1

Чтобы установить значения по умолчанию при создании моего объекта, я добавил класс под названием [EntityName] .shared.cs. Затем я использовал технику, написанную на этом link. Это сработало для меня.

0

Это решение позволяет вам добавить новый элемент в конце коллекции. Коллекция привязана к DataForm. Перед тем как выйти из текущего обработчика, установите DataForm.CurrentIndex в качестве последнего элемента в коллекции, затем отмените процедуру добавления. Новый элемент инициализируется/добавляется и отображается в Dataform, готовом для редактирования.

private void ResolutionDataForm_AddingNewItem(object sender, DataFormAddingNewItemEventArgs e) 
    { 
     // add a new iten in collection 
     Resolution resolution = new Resolution() { FaultName = "test" }; 
     context.Resolutions.Add(resolution); 
     //through binding the form gets updated 
     ResolutionDataForm.CurrentIndex = context.Resolutions.Count-1; 

     // cancel de current adding procedure 
     e.Cancel = true; 

    }