【发布时间】: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=Source 和 Path=DataContext.Source,但它们在运行时(分别)失败并出现这些错误:
BindingExpression 路径错误:“DataContext”属性未在 'object' ''ListCollectionView' BindingExpression 路径错误:'Source' 在“对象”“ListCollectionView”上找不到属性
我的印象是,当我将 ListView 的 DataContext 设置为 CollectionViewSource 时,我应该能够访问它的属性(例如Source)。为什么我需要在此处添加RelativeSource?
这里有一系列子问题,我完全意识到这一点。因此,非常感谢您回答几个问题或提供一些指示。
谢谢!
【问题讨论】: