1

我有一个ObservableCollection<MyEntity>并且MyEntity有一个IsChecked带有PropertyChanged事件的属性。我有一个Button并且我想将IsEnabled属性更改为true当至少其中一个MyEntityMyObservableCollection选中时。我创建了一个转换器,它至少在检查ObservableCollectiona 时接受并返回 true 。MyEntity但是return "null"被退回了。怎么了 ?感谢您的帮助。

XAML

<Window.Resources>
    <CollectionViewSource x:Key="MyObservableCollection"/>
    <src:MyConverter x:Key="MyConverter"/>
</Window.Resources>
<Button IsEnabled="{Binding Converter={StaticResource MyConverter}, Source={StaticResource MyObservableCollection}}"/>

C# 转换器

class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (null == value)
            return "null";

        ReadOnlyObservableCollection<object> items = (ReadOnlyObservableCollection<object>)value;

        List<MyEntity> myEntities = (from i in items select (MyEntity)i).ToList();

        foreach (MyEntity entity in myEntities)
        {
            if (entity.IsChecked)
            {
                return true;
            }
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }
}
4

2 回答 2

1

由于 StaticResources 是在初始化自身时解决的,即在那时InitializeComponent()但直到那时您的集合尚未初始化,这就是为什么将 null 值传递给转换器的原因。因此,更好的选择是将代码中的该属性移到后面并绑定到该属性,因为绑定将在InitializeComponent(). 在您的代码隐藏中创建属性-

public CollectionViewSource MyObservableCollection { get; set; }

并绑定到您的按钮 -

    <Button IsEnabled="{Binding MyObservableCollection, RelativeSource=
{RelativeSource AncestorType=Window}, Converter={StaticResource MyConverter}}"/>
于 2012-08-14T19:08:30.073 回答
1

我认为你的绑定是错误的。转换器想要的是基础集合而不是CollectionView. 并设置CollectionViewSource.Sourceafter InitializeComponent(),Binding 将被刷新。

<Button IsEnabled="{Binding Path=SourceCollection,
                            Converter={StaticResource MyConverter},
                            Source={StaticResource MyObservableCollection}}" />
于 2012-08-14T19:09:41.687 回答