2014-10-03 38 views
0

屬性顯示名稱可以在設計時在諸如實體,屬性等各種對象上更改。 我想在運行時在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

回答

0

不解決您的特定問題,但可能的解決方法。

如果你要在你的屏幕上創建一個局部變量(比如說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