如何在使用Silverlight DataForm和.Net RIA Services DomainDataSource时设置初始值?

如何在使用Silverlight DataForm和.Net RIA Services DomainDataSource时设置初始值?

问题描述:

我正在尝试.Net RIA和Silverlight,我有一些相关的实体;客户,项目和工作,客户有很多项目,一个项目有很多工作。如何在使用Silverlight DataForm和.Net RIA Services DomainDataSource时设置初始值?

在Silverlight应用程序中,我使用了DomainDataSource,并使用DataForm控件执行CRUD操作。当选择客户时,会出现一个项目列表,此时用户可以为该客户添加一个新项目。我希望能够自动填充客户端的值,但似乎没有办法做到这一点,而DataForm控件上有一个AddingNewItem事件,它似乎在DataForm有一个之前触发新对象的实例,我不确定通过DomainDataSource SubmittingChanges事件通过ChangeSet拖网是完成此操作的最佳方式。

我认为这将是一个显而易见的功能......任何人都知道实现此功能的最佳方式?

+0

TheDuke,你找到了你的问题的解决方案吗? 我也有类似的情况:我想用XAML定义的DataContext中的某些数据预填充NewItem模板窗口的某些DataField。它可能来自DataGrid或DataForm本身。但是,既没有,也没有我尝试过的解决方案,这使我能够将NewItem模板与数据绑定。 – AlvinfromDiaspar 2009-11-06 16:21:25

+0

我没有太多运气,反正这只是一个个人项目,所以我没有真正把这个做得更远。我到底做了什么并不是一个理想的解决方案,但通过使用DataForm的AddingNewItem和EditEnded事件,我保留了天气的布尔值,用户正在添加一个新项目,然后另外在EditEnded事件处理程序中检测用户是否保存一个使用该布尔值的新项目,并适当地设置所需的值。我还没有完全测试,我的DataForms的AutoEdit和AutoCommit属性设置为false。 – TheDuke 2009-11-17 10:37:01

好,迟到的党,但面临着同样的问题,我用一个值转换器实现的一种变通方法:

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-参数来增加/减少天数。

通常所做的一件事就是拥有一个包含显示现有数据的DataGrid的屏幕。然后有一个添加按钮,即会:指定

  1. 新建一个项目
  2. 创建ChildWindow,传递新的项目到ChildWindow构造
  3. 有ChildWindow内部数据形,绑定到项目
+0

这是一个诱人的选择,虽然我当前的视图是主细节,但我已经在DataGrid旁边有一个DataForm。 DataForm具有它自己的添加按钮,这正是我当前使用的将记录添加到数据库中的功能。 我会将回复标记为有用,但我不相信这是实现这一目标的唯一方式。任何输入不胜感激。 – TheDuke 2009-10-08 10:19:52

为了在我的实体创建时设置默认值,我添加了一个名为[EntityName] .shared.cs的类。然后我使用了这个拼写在这个link的技术。它对我很好。

该解决方案允许您在集合的末尾添加新项目。该集合绑定到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; 

    }