【问题标题】:Binding ListView Visibility when DataContext is a CollectionViewSource当 DataContext 是 CollectionViewSource 时绑定 ListView 可见性
【发布时间】:2011-07-22 15:23:51
【问题描述】:

我是 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 路径错误:'Source' 在“对象”“ListCollectionView”上找不到属性

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

这里有一系列子问题,我完全意识到这一点。因此,非常感谢您回答几个问题或提供一些指示。

谢谢!

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供此链接。虽然这是一个可选的解决方案,但我最终只是直接绑定到 ViewModel 中的 Collection 而不是 CollectionViewSource,因为我在更改通知方面遇到了困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2011-12-18
    相关资源
    最近更新 更多