2011-06-22 10 views
2

コンボボックスはList<Person>にバインドされています(ItemsButtonにItemsSourceが設定されています)。コンボボックスのプロパティをプロパティに応じて表示する

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

だから、すべての人の名前がリストに追加されます。

ComboBoxにすべての名前を表示する必要はないため、boolのプロパティHideを追加しました。このプロパティがtrueに設定されている場合、名前はコンボボックスに表示されません。

しかし、コンボボックスのバインディングにどのように条件を追加すると、隠されていないと思われる人物だけがリストに表示されるようになりますか?

EDIT: についての答えは、私は次のコードを追加:

{ 
    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

あなたが背後にあるコードのいずれかでフィルタか、またはあなたがvisilbilityコンバータにブールで(isHidenプロパティに項目の可視性をバインドする項目テンプレートを使用することができますコンボ定義されたリストと)。 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

これは本当に面白い解決策です。私はそれを試しましたが、それは動作しませんが、ゲッターが実行され、デバッガは私に "偽"を表示します。私は調査しなければならない、実際に何が起こるか。 – Em1

+1

クラスは、 'IsVisible'プロパティが変更されたときに' INotifyPropertyChanged'を実装し、 'PropertyChanged'を生成しなければなりません。 –

+0

..可視性バインディングに 'UpdateSourceTrigger = PropertyChanged'を設定しました – DefenestrationDay

2

あなたはどこにあなたが素敵なインターフェイスを取得します

(リスト)あなたは、静的メソッドCollectionViewSource.GetDefaultViewでこのコレクションを取得することができます 、データソースのCollectionViewSource、あなたのリストにフィルタを追加する必要があります言うフィルター(非表示= false)を

0

を追加することができますが、それはソース

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

今すぐ者を更新し、それへのリストは、このフィルタのint型にキャストとしてフィルタを提供すること前にリスト上のLINQクエリを適用することができますOそれはソース...

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

私の提案は、このようにしないことです。どうして?それは間違っていません、しかし、コンボボックスに空の崩壊した行を生成する! :/
私の場合、私は5人のユーザーのリストを持ち、すべてを削除しました。しかし、私はまだコンボボックスの中に5つの小さなクリック可能な(!)行がありました。 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> 
関連する問題