我有 ObservableCollection<MyEntity>
和 MyEntity
有 IsChecked
属性且 PropertyChanged
事件 . 我有一个 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();
}
}
2 回答
我认为你的绑定是错误的 . 转换器想要的是底层集合而不是
CollectionView
. 并在InitializeComponent()
之后设置CollectionViewSource.Source
,Binding将被刷新 .由于StaticResources在初始化时被解析,即在
InitializeComponent()
时,但直到那时你的集合还没有初始化,这就是为什么空值被传递给转换器的原因 . 因此,更好的选择是在您的代码中移动该属性并绑定到该属性,因为绑定将在InitializeComponent()
之后重新开始 . 在代码隐藏中创建属性并绑定到您的按钮 -