当DataContext是CollectionViewSource时绑定ListView可见性

时间:2011-07-22 15:23:52

标签: wpf binding

我是WPF世界的新手,我经常问自己“我做得对吗?”我当前的场景涉及根据集合的状态绑定ListView的可见性。我的转换器工作正常,我的问题/问题是如何最好地声明XAML来设置绑定。

首先,我有一个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}}"

在第二种情况下,Convert方法被调用两次,我不知道为什么......这让我相信这不是'正确'的方式。

最后,我还尝试将路径设置为Path=SourcePath=DataContext.Source,但那些在运行时(分别)失败并出现这些错误:

  

BindingExpression路径错误:找不到'DataContext'属性    'object'''ListCollectionView'BindingExpression路径错误:'来源'   'object'''ListCollectionView'

上找不到属性

我的印象是,当我将ListView的DataContext设置为CollectionViewSource时,我应该能够访问其属性(例如Source)。为什么我需要在此处添加RelativeSource

这里有一系列子问题,我完全明白。因此,非常感谢您回答一些问题或给出一些指示。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果要绑定到提供项目的对象上的某些属性,则需要在绑定中将BindsDirectlyToSource设置为true