2011-10-05 17 views
2

如果附屬屬性發生變化,是否可以通知「父母」?如果附加屬性發生變化,是否可以通知「父母」?

我很困擾WPF問題。我有一個類「ContainerVisual」(實際上是一個visual3D,但應該是無關緊要的),它定義了一個附屬屬性「IsChildVisible」。在XAML中,我使用這個視覺效果,並添加了一些孩子。每個孩子使用附加屬性,並將其值綁定到視圖模型中的屬性。當視圖模型中的屬性從true變爲false時,孩子應該消失,如果變回true,孩子應該重新出現。

爲了使這成爲可能,我在ContainerVisual中處理這個問題的邏輯。然後我聽到依賴項屬性發生更改事件,如下所示:

public static readonly DependencyProperty IsChildVisibleProperty = 
    DependencyProperty.RegisterAttached("IsChildVisible", typeof(bool), 
    typeof(ContainerVisual), new UIPropertyMetadata(true, IsChildVisiblePropertyChanged)); 

private static void IsChildVisiblePropertyChanged(DependencyObject d, 
    DependencyPropertyChangedEventArgs e) {} 

到目前爲止這麼好。我的問題是,發件人,事件附帶的DependencyObject是孩子,而不是父母。通常這不是一個大問題,因爲您可以使用樹幫助器類來獲取父級,但這需要首先在視覺/邏輯樹中顯示視覺。如果該值從false更改爲true,則需要通知「父級」將對象放回樹中。當然這個對象在這一點上沒有父級,所以要找到它會很難......

所以我的問題是這樣的: 是否有可能在定義類的實例中獲得通知附加屬性(在我的情況下,ContainerVisual類的實例),如果一個對象使用附加屬性(子)更改屬性的值?

如果這是不可能的,有沒有辦法讓我隱藏一個視覺小孩而不從視覺和/或邏輯樹中移除它?

編輯: 如果有幫助,我已經存儲了所有潛在的孩子的參考。我只需要調用一個參數 - 少public方法在我ContainerVisual實例...

+0

爲什麼父母首先處理可見性?你爲什麼不簡單地將兒童的可見性屬性綁定到VM屬性? –

+0

Visual3D(或實際上ModelVisual3D)沒有Visibility屬性。這就是我想要創造的。據我所知,只要是在視覺樹中,孩子們都是可見的。因此,我的解決方案是根據我在視圖模型中指定的條件從樹中添加或刪除它們。 – Sverre

回答

3

如果你有參考所有潛在的孩子,你可以使用DependencyPropertyDescriptor

退房 Attached Property Changed Event?

希望它幫助。

+0

我之前看過這篇文章,是的,這是一個可能的解決方案,但我希望避免它。它創建了一些開銷代碼,它需要維護已連接事件的對象(確保沒有由於事件處理程序而阻止GC的對象),並且在我看來,它似乎不太直觀,可以將事件連接到依賴項屬性。 你知道是否有可能走另一條路,並從孩子那裏找到父母? – Sverre

+0

看到回覆有點晚了。如果您找到了不同的解決方案,請分享。就找到父母而言,找到從樹上移除的孩子的父母似乎不合邏輯。只是因爲,一旦它從樹上移除,它不是任何孩子,所以它沒有任何父母。 – JSB

+0

我結束了你鏈接到的解決方案。我不是100%滿意,但我認爲這是我能得到的最好的。正如你所說,找到父母給樹外的孩子是不合邏輯的,也是不可能的。 – Sverre

相關問題