2011-01-08 3 views
1

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

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

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)

Если вы не позволить 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)

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

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

Это точно, я не хочу использовать AutoGeneratingField, а также, как вы знаете, когда вы привязываете элемент управления (например, TextBox) в поле данных, метка устанавливается автоматически (из атрибута DisplayName объекта данных) что я должен иметь возможность редактировать. не устанавливайте этикетку голыми руками;) Первое, что мне пришло в голову, - создать класс и наследовать от базы и тени свойство метки, но поскольку ярлык никогда не устанавливается, вы не можете изменить значение. Мне нужно знать, когда DataField устанавливает свойство Label. – Peymankh

+0

@Peymankh Только мое первое предложение касалось создания DataFields вручную. Вы пробовали другие три? Это общие и многоразовые. Вы получите доступ к сгенерированному DataField. Возможно, вам потребуется добавить слушателя для свойства Label. Как это сделать, посмотрите здесь: http://stackoverflow.com/questions/834929/silverlight-how-to-receive-notification-of-a-change-in-an-inherited-dependencypr – herzmeister

+0

Я думаю, что наследование DataField, как вы пробовали, не так легко, или вы нашли способ сообщить DataForm о создании экземпляров вашего класса CustomDataField вместо обычного класса DataField? Тем не менее, другим вариантом было бы изменить исходный код напрямую. Инструментарий является открытым исходным кодом, поэтому просто свяжите проект с источником. – herzmeister