2011-06-22 49 views
2

我有一個綁定到List<Person>(ItemsSource在CodeBehind中設置)的組合框。在依賴於屬性的組合框中顯示項目

<ComboBox Width="120" Background="White" DisplayMemberPath="Name" />

因此,所有人員的姓名添加到列表中。

因爲沒有必要在組合框中顯示每個名稱,所以我添加了屬性Hide,其類型爲bool。如果此屬性設置爲true,則該名稱不應顯示在組合框中。

但是怎麼可能爲組合框的綁定添加一個條件,以便只列出那些不應該被隱藏的人。

編輯: 對於答案,我添加以下代碼:

{ 
    List<Person> persons; 
    ... 
    var collectionView = CollectionViewSource.GetDefaultView(persons); 
    collectionView.Filter = HideFilter; 
} 

... 

private bool HideFilter(object item) 
{ 
    Person p = item as Person; 
    return p.Hide; 
} 

但是,這將引發對collectionView.Filter = HideFilter;一個TargetInvocationException。
我誤解了什麼?

+0

請參閱http://msdn.microsoft.com/en-us/library/ms752348.aspx。 –

回答

5

,你可以在代碼或者過濾器後,或者你可以使用一個項模板綁定項目的isHiden財產的可見性(用布爾到visilbility轉換器)。您的XAML代碼應該是:

 <ComboBox Grid.Column="1" Grid.Row="0" > 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Visibility="{Binding IsVisible}" Text="{Binding Name}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 


public class person 
{ 
    public person(string n, Visibility v) 
    { 
     Name = n; 
     IsVisible = v; 
    } 
    public string Name {get;set;} 
    public Visibility IsVisible { get; set; } 
} 
+0

這是一個非常有趣的解決方案。我試過了,但它不起作用,雖然getter運行,調試器顯示我'false'。我必須調查,在這種情況下真的發生了什麼。 – Em1

+1

當IsVisible屬性發生變化時,類必須實現'INotifyPropertyChanged'並引發'PropertyChanged'。 –

+0

..並在可見性綁定 – DefenestrationDay

2

您需要將過濾器添加到數據源的CollectionViewSource,你的清單, 你可以得到這個收集與靜態方法CollectionViewSource.GetDefaultView(名單)

,你會得到一個漂亮的界面,你可以添加一個過濾器,說(隱藏= FALSE)

0

您可以在列表應用LINQ查詢之前使它源

List<Person> persons = new List<Person>(); 
var Filter = from p in persons 
      where p.hide == false 
      select p; 

現在續約的人,並提供過濾器列表將其施放此過濾器INT O列表,並將其定義組合源...

persons = new List<Person>(Filter); 
cbm.ItemSource = persons ; 
0

我的建議是不要這樣做。爲什麼?它沒有錯,但是它在組合框中產生空的摺疊行! :/
在我的情況下,我有一個五個用戶的列表,並全部刪除。但是在組合框內仍然有五個可點擊的小行(!)。 oO

<ComboBox Grid.Column="1" Grid.Row="0" > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Visibility="{Binding IsVisible}" Text="{Binding Name}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

而是我使用如下所示的代碼。這是我對用戶列表的解決方案。當我將用戶標記爲已刪除(如果選中,點擊按鈕,標記爲已刪除),它會完全從列表中消失。

<ComboBox ItemsSource="{Binding Path=UserList}" 
     SelectedItem="{Binding SelectedUser}" 
     DisplayMemberPath="Name" 
     IsEnabled="{Binding SelectedUser.HasErrors, TargetNullValue=True, FallbackValue=True, ValidatesOnNotifyDataErrors=False, Converter={StaticResource Bool2BoolNot}}" 
     IsEditable="False" 
     > 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="ComboBoxItem"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Deleted}" Value="True"> 
        <DataTrigger.Setters> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=Special}" Value="True"> 
        <DataTrigger.Setters> 
         <Setter Property="Foreground" Value="Red"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=Super}" Value="True"> 
        <DataTrigger.Setters> 
         <Setter Property="Foreground" Value="DarkRed"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox>