2011-01-08 79 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