2012-08-14 109 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}}"/>