【问题标题】:WPF - Button IsEnabled Binding ConverterWPF - 按钮 IsEnabled 绑定转换器
【发布时间】:2012-08-11 01:42:36
【问题描述】:

我有一个 ObservableCollection<MyEntity>MyEntity 有一个带有 PropertyChanged 事件的 IsChecked 属性。 我有一个Button,我想在选中MyObservableCollection 中的至少一个MyEntity 时将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();
    }
}

【问题讨论】:

  • 你在哪里添加数据到这个集合MyObservableCollection
  • value 对象是否为空?如果是这样,您的来源只是空,您实际上在哪里填充 CollectionViewSource
  • CollectionViewSource 填充在 Window Constructor 中,并显示在 DataGrid 中,效果很好。
  • @Anthony:尝试在 InitializeComponent() 调用之前填充它
  • @dwrd 是而且DataGrid不为空

标签: wpf button binding converter isenabled


【解决方案1】:

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

public CollectionViewSource MyObservableCollection { get; set; }

并绑定到您的按钮 -

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

【讨论】:

    【解决方案2】:

    我认为你的 Binding 是错误的。转换器想要的是基础集合而不是CollectionView。并在InitializeComponent()之后设置CollectionViewSource.Source,Binding会被刷新。

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

    【讨论】:

    • 非常感谢,我认为 Path=SourceCollection 是改变一切的关键。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多