2011-01-08 155 views
1

我在它绑定到在Silverlight应用程序我的视图模型的属性数据形数据字段标签值,我已经建立了我的实体类与WCF RIA Services和每个属性有显示在数据表单数据字段标签中的DisplayName属性。我需要做的是在我创建的自定义数据字段中的每个标签的末尾添加一个“:”。 我需要这种情况发生的原因是因为我在我的页面网格被绑定到当前对象(例如员工)的列表,我不希望“:”在网格报头的结束,但我也需要“:”当我尝试编辑或添加新员工时。变化的Silverlight的DataForm:在运行时

这是我到目前为止已经完成,但它不工作。

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)

当你不让数据形自动生成的领域,你有在田野上更多的控制,可以手动设置标签:

<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)

如果你需要自动生成功能,但你还需要在如何显示的字段更多的控制,你可以换数据形到自定义的控制。您必须自己实现自动生成才能构建您自己的EditTemplate,并将其分配给DataForm。这是我走的路。

(3)

另一种快速和肮脏的方法是通过视觉树遍历数据形已使更改标签后。那去从工具箱一点帮助非常简单:

// 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事件可以工作(未经测试):

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

这也正是这一点,我不希望使用AutoGeneratingField也,你知道,当你在你的数据场绑定控件(例如文本框),该标签被自动设置(从数据实体显示名称属性),我需要能够编辑。没有徒手设置标签;)我想到的第一件事情是,创建一个类并从基础继承,并映射标签属性,但由于Label从未设置,因此无法更改该值。我需要知道DataField何时设置Label属性。 – Peymankh 2011-01-08 16:32:10