2011-07-22 80 views
1

我對WPF的世界很陌生,我不斷地問自己'我正在做對嗎?'。我目前的情況是基於集合的狀態來綁定ListView的可見性。我有轉換器工作得很好,我的問題是如何最好地聲明XAML來設置綁定。當DataContext是一個CollectionViewSource時,綁定ListView的可見性

首先,我有一個CollectionViewSource,這勢必視圖模型的ObservableCollection

<CollectionViewSource x:Key="MyViewSource" Source="{Binding Path=MyCollection}" /> 

接下來,我宣佈我的ListView如下:

<ListView DataContext="{StaticResource MyViewSource}" ItemsSource="{Binding}" /> 

的代碼爲我的轉換器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value != null && (value is ICollection && (value as ICollection).Count > 0)) 
      return Visibility.Visible; 

    return Visibility.Hidden; 
} 

我已經出現有兩種方法來設置綁定,所以它的實際工作:

第一:

Visibility="{Binding Path=SourceCollection, 
    Converter={StaticResource ListToVisibilityConverter}}" 

第二:

Visibility="{Binding RelativeSource={RelativeSource Self}, 
    Path=DataContext.Source, 
    Converter={StaticResource ListToVisibilityConverter}}" 

在第二種情形中,轉換方法被調用兩次,我不知道爲什麼......這讓我相信這不是'正確'的方式。

最後,我也嘗試設置路徑Path=SourcePath=DataContext.Source但那些在運行時(分別)失敗,這些錯誤:

BindingExpression path error: 'DataContext' property not found on 'object' ''ListCollectionView' BindingExpression path error: 'Source' property not found on 'object' ''ListCollectionView'

我的印象是,當我設置的DataContext ListView控件來是一個CollectionViewSource,我應該能夠訪問它的屬性(例如Source)。爲什麼我需要在這裏添加RelativeSource

在這裏有一系列的子問題,我完全認識到這一點。因此,僅僅回答一些問題或者給出一些指示就非常感謝。

謝謝!

回答

1

如果要綁定到提供項目的對象上的某些屬性,您需要在綁定中將BindsDirectlyToSource設置爲true

+0

感謝您提供此鏈接。雖然它是一個可選的解決方案,但我最終只是直接綁定到ViewModel中的Collection而不是CollectionViewSource,因爲我在更改通知時遇到了困難。 – danjarvis

相關問題