1

我有一个数据表单,它绑定到 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 + ":";
            }
        }
    }
}
4

1 回答 1

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 + ":";
于 2011-01-08T15:22:52.017 回答