Изменить Silverlight DataForm: значение метки DataField во время выполнения - PullRequest
1 голос
/ 08 января 2011

У меня есть форма данных, которая привязана к свойству в моей модели представления в приложении Silverlight, я создала свои классы сущностей с помощью служб WCF RIA, и каждое свойство имеет атрибут DisplayName, который отображается в форме данных метка поля данных. мне нужно добавить «:» в конце каждой метки в пользовательских полях данных, которые я создаю. Мне нужно, чтобы это произошло, потому что у меня есть сетка на моей странице, которая привязана к списку текущих объектов (например, сотрудников), и я не хочу ":" в конце заголовков сетки, но мне также нужно ":" когда я пытаюсь отредактировать или добавить нового сотрудника.

Это то, что я сделал до сих пор, но это не работает.

public class CustomDataField : DataField
{
    public CustomDataField()
    {

    }

    public new object Label
    {
        get { return base.Label; }
        set 
        { 
            base.Label = value;
            if( value is string )
            {
                base.Label = (string)value + ":";
            }
        }
    }
}

1 Ответ

1 голос
/ 08 января 2011

(1)

Когда вы не позволяете DataForm автоматически генерировать поля, у вас есть больший контроль над полями и вы можете устанавливать метки вручную:

<tkt:DataForm AutoGenerateFields="False" AutoEdit="True">
    <tkt:DataForm.EditTemplate>
        <DataTemplate>
            <StackPanel>
                <tkt:DataField Label="SomeLabel:">
                    <TextBox Text="{Binding SomeProperty, Mode=TwoWay}" />
                </tkt:DataField>

                [...]

            </StackPanel>
        </DataTemplate>
    </tkt:DataForm.EditTemplate>
</tkt:DataForm>

(2)

Если вам нужна функция автоматической генерации, но вам также нужно больше контроля над отображением полей, вы можете обернуть DataForm в свой собственный элемент управления.Вам нужно будет реализовать самогенерацию самостоятельно, чтобы создать свой собственный шаблон EditTemplate, который вы назначите для DataForm.Это путь, по которому я пошел.

(3)

Еще один быстрый и грязный способ - перебирать визуальное дерево после того, как DataForm отобразит, чтобы изменить метки.Это довольно просто с небольшой помощью инструментария:

// needs System.Windows.Controls.Toolkit.dll

using System.Linq;
using System.Windows.Controls.Primitives;

foreach (var field in myDataForm.GetVisualDescendents().OfType<DataField>())
{
    field.Label = field.Label + ":";
}

(4)

Наконец, я только что увидел, что в DataForm есть событие AutoGeneratingField, которое может работать (не проверено):

myDataForm.AutoGeneratingField += (sender, e) => e.Field.Label = e.Field.Label + ":";
...