在运行时更改显示名称(桌面客户端)

问题描述:

属性显示名称可以在设计时在诸如实体,属性等各种对象上更改。 我想在运行时在Desktop Client中更改DisplayName。 对于某些对象很容易,如屏幕或实体:它们明确地提供了一个属性。在运行时更改显示名称(桌面客户端)

对于实体属性它有点不同。 如果程序员在设计时显式添加了显示名称,我只能更改DisplayName。

这里这段代码工作完美:

IServiceProxy sproxy = VsExportProviderService.GetExportedValue<IServiceProxy>(); 
IModuleDefinition module = sproxy.ModelService.Modules.Where(m => m.Id == "LightSwitchApplication.Localization.DesktopClient:!module").SingleOrDefault(); 
IEnumerable<IGlobalItem> items = module.GlobalItems; 
var entities = items.OfType<EntityType>().Where(e => e.Name == "CoreApplication"); 
foreach (var entity in entities) 
{ 
    DisplayName dn; 

    foreach (var property in entity.Properties) 
    { 
     dn = property.Attributes.OfType<DisplayName>().SingleOrDefault(); 
     if (dn != null) 
     { 
      dn.value = Helper.CreateNewValue(); 
     } 

    } 
} 

但如果DN是空我怎么可以添加一个新的显示名称,而不在后一阶段,例如运行到一个异常在保存操作过程中?

感谢您的帮助。

Hans

不解决您的特定问题,但可能的解决方法。

如果你要在你的屏幕上创建一个局部变量(比如说myLabelString),你应该可以将它拖拽到屏幕控制树中的适当位置,然后dataBind()你的属性值的值在使用PostRender()事件的运行时HTML元素之后。您可以使用$(element).replaceWith(“< ..>”+ contentItem.stringValue +“”)任意格式化此元素,然后简单地关闭相关字段的标题。

例如这将检测变量值的变化并更新屏幕上的标签控件,将其作为H3元素呈现。

myapp.MyScreen.myLabelString_postRender() = function (element, contentItem) { 
    contentItem.dataBind ("stringValue", function (newValue) { 
     contentItem.stringValue = newValue.ToString(); 
    }); 
    $(element).replaceWith("<h3>" + contentItem.stringValue + "</h3>"); 
} 

有关数据绑定的更多信息,请参阅http://blogs.msdn.com/b/lightswitch/archive/2012/12/06/custom-controls-and-data-binding-in-the-lightswitch-html-client-joe-binder.aspx

希望有帮助!

+0

感谢Ozziemedes 不幸的是,您现在的答案现在无法帮助我,因为我正在与桌面客户端合作。我当然会在使用html客户端时使用你的代码。 最好的问候, – tauxingadev 2014-10-20 06:39:41

+0

啊 - 在桌面客户端这很容易。同样的方法,但数据绑定几乎是一个直接的任务,而不是通过所有的JavaScript层将事件冒泡。 – Ozziemedes 2014-10-21 10:09:23