2014-10-10 191 views
1

我有一個從CollectionViewGroup動態構建的ControlTemplate。WPF綁定Visiblity到集合屬性

我希望它的可見性只有在所有項目的某個屬性設置爲true時才爲真。我有所通過完成此:

XAML

<Button Visibility="{Binding Path=Items, Converter={StaticResource AllAcceptedToVis}}" Click="Button_ShipmentComplete_Click" Width="150" Margin="100,0,0,0">Complete</Button> 

C#

public class AllAcceptedToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var items = (IEnumerable<object>)value; 

     return items.Cast<MyObject>().All(m => m.Accepted) ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new InvalidOperationException("AllAcceptedToVisibilityConverter can only be used OneWay."); 
    } 
} 

這個工作,但是當它加載只。它不檢查初始創建後的更改,我懷疑是因爲它綁定到地址列表(項目)而不是屬性,所以它實際上檢測到地址列表中沒有任何更改(它們保持不變)。

我該如何完成上述操作,但是讓綁定動態監視所有的項目屬性更改?

+1

@KingKing對他不會有任何好處;該綁定是針對**收集實例**的,所以只有當'Items'設置爲新集合時纔會調用轉換器。如果集合發生更改,或者集合中的項目的某些屬性發生更改,則綁定引擎不知道它應該重新評估綁定。 – 2014-10-10 18:02:25

回答

1

這裏的問題是,你對集合實例結合,所以綁定如果當你分配一個新的集合Items纔會重新評估。據推測,你只設置了Items一次,所以轉換器只會被調用一次。當集合被修改時它不會被調用,也不會在集合中的項目被修改時被調用。 WPF綁定不支持這些「深層」依賴關係,因此您需要找到不同的方法。

我建議在您的視圖模型上維護一個單獨的屬性,例如AllItemsAccepted,您可以直接綁定它。您可以聽取Items上的增加,刪除和替換,並傾聽Items中任何元素的屬性更改。發生這種變化時,您必須重新評估AllItemsAccepted。不要忘記提出物業更改通知,以便對AllItemsAccepted上的任何綁定進行重新評估。

注意這裏的概念的MultiBinding(和IMultiValueConverter),但這些都是如果正在針對已知的結合,固定的一組值(例如,兩個或更多個單獨的屬性)的唯一有用的;他們不會幫助你獲得動態收藏。我只是把它們拿起來,以免你掉下一個兔子洞並空着。

+0

感謝您的答案邁克。 我的問題是,我有很多這些動態創建的按鈕,他們都有自己的一套項目(他們本質上是一個集合的組風格),所以我不能有一個靜態他們之間的變量來決定可見性。 雖然也許我誤解了你。 – nextint 2014-10-10 19:02:32

+0

您問題中的轉換器會評估是否所有項目都被接受;你只需要自己評估一下,把結果放在一個可訪問的地方(比如'Items'旁邊),並且保持最新狀態。基本上,你自己要做的是你希望綁定爲你做什麼。 – 2014-10-10 19:15:23

+0

很抱歉對已故的評論,但我撤回了我的投票,因爲我認爲你試圖冷靜地談論實際上是問題的部分,而不是冒犯。我只是不想混淆任何其他讀者。對於未來的讀者,我認爲邁克已經誤解了這個問題,這是沒有價值的。 – nextint 2014-10-17 13:21:04