我将DataForm用于具有大约40个属性的实体。我很满意表单如何显示除3个属性之外的所有属性。这3个属性恰好是项目列表。
我不想编写整个编辑模板,看起来效率很高。
<dataFormToolkit:DataForm AutoGenerateFields="True" CurrentItem="{Binding XXX, Mode=TwoWay, Source={StaticResource XXXViewModel}}" >
<dataFormToolkit:DataField Label="Client" >
<ListBox ItemsSource="{Binding Client}"></ListBox>
</dataFormToolkit:DataField>
</dataFormToolkit:DataForm>
答案 0 :(得分:5)
WCF RIA Services包含一个Silverlight业务应用程序项目模板,该模板演示如何创建一个CustomDataForm,覆盖OnAutoGeneratingField
并仅修改所需属性的字段。我已经在这里复制了代码来说明这个想法,但我建议你查看真实的东西,看看他们是如何使用ReplaceTextBox扩展方法来处理数据绑定的。 Download link
public class CustomDataForm : DataForm
{
protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
{
// Get metadata about the property being defined
PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);
// Do the password field replacement if that is the case
if (e.Field.Content is TextBox && this.IsPasswordProperty(propertyInfo))
{
e.Field.ReplaceTextBox(new PasswordBox(), PasswordBox.PasswordProperty);
}
// Keep this newly generated field accessible through the Fields property
this.fields[e.PropertyName] = e.Field;
// Call base implementation (which will call other event listeners)
base.OnAutoGeneratingField(e);
}
}
答案 1 :(得分:1)
它会起作用:试试
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class IsPassword : System.Attribute { }
public class CustomDataForm : DataForm
{
protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
{
// Get metadata about the property being defined
PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);
// Do the password field replacement if that is the case
var attributes = propertyInfo.GetCustomAttributes(typeof(IsPassword), false).ToList();
if (attributes.Any(obj=>obj is IsPassword))
{
PasswordBox box= new PasswordBox();
Binding binding = new Binding(e.PropertyName);
binding.Mode = BindingMode.TwoWay;
box.SetBinding(PasswordBox.PasswordProperty, binding);
e.Field.Content=box;
}
base.OnAutoGeneratingField(e);
}
}
然后只需将[IsPassword]添加到您的媒体资源
答案 2 :(得分:-1)
我很确定这是不可能的。如果我是你,我会吞下我的悲伤并创建该编辑模板。
我能看到的唯一选择是使用viewmodel中的数据并创建一个包含37个不需要更改的属性的单独类。然后你为3需要特别注意的单独实体。这样,您可以拥有两种数据形式,一种是自动生成的,另一种是自定义。希望您可以使用它们的样式,使它们看起来像一个表单。我知道很多工作,但创建完整的编辑模板可能还需要做更多的工作。