WPF - 按钮已启用绑定转换器



我有一个ObservableCollection<MyEntity>MyEntity有一个PropertyChanged事件的IsChecked属性。我有一个Button,我想在选中MyEntity MyObservableCollection中的至少一个时IsEnabled属性更改为true。我创建了一个转换器,它接受ObservableCollection并在至少检查MyEntity时返回 true。但是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();
    }
}

我认为你的绑定是错误的。转换器想要的是底层集合而不是CollectionView。并在InitializeComponent()后设置CollectionViewSource.Source,绑定将被刷新。

<Button IsEnabled="{Binding Path=SourceCollection,
                            Converter={StaticResource MyConverter},
                            Source={StaticResource MyObservableCollection}}" />

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

public CollectionViewSource MyObservableCollection { get; set; }

并绑定到您的按钮 -

    <Button IsEnabled="{Binding MyObservableCollection, RelativeSource=
{RelativeSource AncestorType=Window}, Converter={StaticResource MyConverter}}"/>

最新更新