我對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=Source
和Path=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
?
在這裏有一系列的子問題,我完全認識到這一點。因此,僅僅回答一些問題或者給出一些指示就非常感謝。
謝謝!
感謝您提供此鏈接。雖然它是一個可選的解決方案,但我最終只是直接綁定到ViewModel中的Collection而不是CollectionViewSource,因爲我在更改通知時遇到了困難。 – danjarvis