我有一个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}}"/>