首页 文章

WPF - 按钮IsEnabled绑定转换器

提问于
浏览
1

我有 ObservableCollection<MyEntity>MyEntityIsChecked 属性且 PropertyChanged 事件 . 我有一个 Button ,当我检查 MyObservableCollectionMyEntity 中的至少一个时,我想将 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();
    }
}

2 回答

  • 1

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

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

    由于StaticResources在初始化时被解析,即在 InitializeComponent() 时,但直到那时你的集合还没有初始化,这就是为什么空值被传递给转换器的原因 . 因此,更好的选择是在您的代码中移动该属性并绑定到该属性,因为绑定将在 InitializeComponent() 之后重新开始 . 在代码隐藏中创建属性

    public CollectionViewSource MyObservableCollection { get; set; }
    

    并绑定到您的按钮 -

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

相关问题