3

我将 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>
4

3 回答 3

5

WCF RIA 服务包括一个 Silverlight 业务应用程序项目模板,该模板演示了如何创建一个 CustomDataForm,在该模板中它们会覆盖和OnAutoGeneratingField修改您想要的属性的字段。我已经复制了这里的代码来说明这个想法,但我建议你查看真实的东西,看看他们是如何使用 ReplaceTextBox 扩展方法来处理数据绑定的。下载链接

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);
    }
}
于 2010-02-04T22:09:04.390 回答
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] 添加到您的财产

于 2011-09-28T15:23:02.100 回答
-1

我很确定这是不可能的。如果我是你,我会忍住悲伤并创建那个编辑模板。

我能看到的唯一选择是使用视图模型中的数据并创建一个单独的类,该类包含不需要更改的 37 个属性。然后你为需要特别注意的 3 个单独的实体。这样,您可以拥有两种数据形式,一种是自动生成的,一种是自定义的。希望您随后可以对它们进行样式设置,使它们看起来像一种形式。很多工作,我知道,但创建完整的编辑模板可能需要更多的工作。

于 2010-01-19T13:28:39.893 回答