Можно ли добавить DataField в Silverlight DataForm без создания всего шаблона редактирования? - PullRequest
3 голосов
/ 10 января 2010

Я использую 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 ]

5 голосов
/ 05 февраля 2010

Служба 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);
    }
}
1 голос
/ 28 сентября 2011

Это будет работать: попробуйте это

    [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] к вашей собственности

0 голосов
/ 19 января 2010

Я уверен, что это невозможно. На вашем месте я бы проглотил свое горе и создал бы этот шаблон редактирования.

Единственная альтернатива, которую я вижу, - это работать с данными в вашей модели представления и создавать отдельный класс, который содержит 37 свойств, которые не нужно изменять. Затем вы делаете отдельную сущность для 3, которые нуждаются в особом внимании. Таким образом, вы можете иметь две формы данных, одну сгенерированную и одну пользовательскую. Надеюсь, вы сможете поработать с ними, чтобы они выглядели как одна форма. Я знаю, что много работы, но для создания полного редактируемого шаблона может потребоваться еще больше работы.

...