[英]Conditional Hide/Show in Xceed PropertyGrid
這個答案很晚; 但是,我使用 Xceed 屬性網格並實現了您所描述的內容。
首先,如果您不想在視圖模型中顯示某個屬性,只需在該屬性上方添加 [Browsable(false)] 屬性即可。
現在,如果您希望能夠根據對另一個屬性的選擇來顯示/隱藏屬性,您可以執行以下操作。
將此事件添加到您的視圖模型。 public event Action<string, bool> ChangeVisible;
每當您想要顯示或隱藏屬性時,您都會引發此事件。 即您有一個“Age”屬性,如果 Age 小於 16,您想隱藏“Employer”屬性。在“Age”屬性設置器中,您將檢查值if (value) < 16
,然后引發事件ChangeVisible?.Invoke("Employer", false);
要顯示它而不是隱藏它,您將傳遞 'true' 而不是 'false'。
為此,您還必須在承載視圖模型的視圖上添加一個偵聽器。 在視圖的構造函數中(我們稱之為“MyView.xaml.cs”),您將在 DataContext(您的視圖模型)上注冊一個偵聽器。 MyViewModel.ChangeVisible += MyViewModel_ChangeVisible;
在偵聽器中,您將直接調用 PropertyGrid 的“ShowProperty”方法。 假設您的 PropertyGrid 的名稱為“MyPropertyGrid”。 您的聽眾將如下所示。
/// <summary> /// Hide/show a preference /// </summary> /// <param name="property">name of the preference</param> /// <param name="show">make it visible or hide it?</param> private void MyViewModel_ChangeVisible(string property, bool show) { Dispatcher.Invoke(() => MyPropertyGrid.ShowProperty(property, show)); }
最后但同樣重要的是,PropertyGrid 沒有 ShowProperty 方法。 因此,您將創建一個帶有公共靜態擴展方法的靜態類,這樣您就可以使所有這些神奇的工作發揮作用。
public static void ShowProperty(this PropertyGrid pg, string property, bool show) { for (int i = 0; i < pg.Properties.Count; ++i) { PropertyItem prop = pg.Properties[i] as PropertyItem; if (prop.PropertyName == property) { prop.Visibility = show ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed; break; } } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.