2012-08-14 129 views
1

我有一个ObservableCollection<MyEntity>MyEntity有一个IsChecked财产与PropertyChanged事件。 我有一个Button和我想IsEnabled属性更改为true至少MyEntityMyObservableCollection被检查。 我创建了一个转换器,该转换器采用ObservableCollection,并且至少检查到MyEntity时返回true。 但是返回return "null"。 有什么不对?感谢您的帮助。WPF - 按钮IsEnabled绑定转换器

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(); 
    } 
} 
+1

在哪里添加数据到这个集合MyObservableCollection? – 2012-08-14 17:48:26

+0

“value”对象是否为空?如果是这样,你的源代码只是null,你在哪里实际填充你的'CollectionViewSource'? – Damascus 2012-08-14 17:49:50

+0

'CollectionViewSource'填充在'Window'' Constructor'中,并显示在'DataGrid'中,效果很好。 – Anthony 2012-08-14 17:58:18

回答

1

我觉得你的绑定是错误的。转换器想要的是底层集合,而不是CollectionView。并设置CollectionViewSource.SourceInitializeComponent(),绑定将刷新。

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

非常感谢,我认为Path = SourceCollection是改变一切的一点。 – Anthony 2012-08-20 15:06:01

1

由于StaticResources在intializing本身在InitializeComponent()的时间,即,但到那时你的集合尚未intialized这就是为什么空的时间分辨值被传递给转换器。 因此,更好的选择是将代码中的该属性移动并绑定到该属性,因为绑定将在InitializeComponent()后重新绑定。在你的代码behind-

public CollectionViewSource MyObservableCollection { get; set; } 

创建属性并绑定到你的按钮 -

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