在运行时更改Silverlight DataForm:DataField标签值

时间:2011-01-08 13:38:57

标签: silverlight dataform datafield

我有一个数据形式绑定到我在Silverlight应用程序中的视图模型中的属性,我已经使用WCF RIA服务创建了我的实体类,并且每个属性都具有DisplayName属性,该属性显示在dataform中数据域标签。我需要做的是在我创建的自定义数据域中的每个标签的末尾添加一个“:”。 我需要这样做的原因是因为我的页面中有一个网格绑定到当前对象列表(例如Employees),我不想在网格标题的末尾添加“:”,但我也需要“:”当我尝试编辑或添加新员工时。

这是我到目前为止所做的,但它没有用。

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 个答案:

答案 0 :(得分: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)

最后,我刚看到DataForm上有一个AutoGeneratingField事件可以工作(未经测试):

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