是否可以在不创建整个编辑模板的情况下将日期归档添加到Silverlight DataForm?

时间:2010-01-10 04:33:46

标签: silverlight silverlight-toolkit dataform

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

3 个答案:

答案 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需要特别注意的单独实体。这样,您可以拥有两种数据形式,一种是自动生成的,另一种是自定义。希望您可以使用它们的样式,使它们看起来像一个表单。我知道很多工作,但创建完整的编辑模板可能还需要做更多的工作。