2011-09-27 7 views
12

IEnumerable <に含まれるオブジェクトのリストがあります。 このリストの数に基づいてコントロールの可視性を設定したいと思います。私は試しました:IEnumerableの 'Count'に対するコントロールの可視性のバインド

Visibility="{Binding MyList.Count>0?Collapsed:Visible, Mode=OneWay}" 

しかし、これは動作しません。私は、テキストブロック内のテキストにMyList.Countをバインドして、カウント値が正しいことを確認しました。可視性を正しく設定していないようです。

+0

これはあなたがこれを使うことができるようです:http://www.11011.net/wpf-binding-expressions – Gabe

答えて

28

バインディングで論理式またはコード式を使用することはできません(PropertyPathが必要です)。私は何をするのかである、converterまたはトリガーを使用するか:

<YourControl.Style>      
    <Style TargetType="YourControl"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding MyList.Count}" Value="0"> 
       <Setter Property="Visibility" Value="Visible" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</YourControl.Style> 

(。ご希望の場合は、もちろんresourceにスタイルをリファクタリングすることができます)

+0

これは偉大です、ありがとう - ありがとう、これをリソース要素にリファクタリングする方法を知っていますか?差異のリストパラメータとして? – BKSpurgeon

+0

@BKSpurgeon:データコンテキストのプロパティが同じではない場合、これは困難です。残念ながらバインディングは静的です。オプションがある場合は、パスがさまざまなデータコンテキスト(データコンテキストが実装されていることを話すインターフェイス)で動作し、常に同じ名前を持つリストプロパティを提供するような規則を作成できます。 –

+0

@BKSpurgeon:マークアップ拡張を使用してバインディングパスを多かれ少なかれ動的に構築するオプションがありますが、おそらくアプリケーションではなくスタイル作成時に実行されるため、おそらくリードしません。 –

0

CountプロパティをVisibility値に変換するコンバータ、または新しい "HasItems"ブール値プロパティをVisibility値に変換するコンバータを使用する必要があります。このようなジョブを処理するには、たとえばboolToVisibilityConvertという名前のものを使用します。

必要に応じて、より詳細な情報を提供できます。

2

三つの方法があります:

  1. 使用するにはHBで述べたトリガー
  2. クラスでIValueConverterを実装し、直接可視性の状態を返すために、あなたのViewModelにプロパティを定義するには、そのクラス
  3. にIValueConverterのインスタンスへの結合のコンバータのプロパティを設定することにより、変換器を使用します。

常にトリガー方式を使用することができますが、それは常に良いアプローチです。 3番目の方法は、MVVMパターンを使用しているとき(そしてViewModelのUI関連のアセンブリを参照することを自分自身で制限していない場合)に便利です。多くのマークアップコードではコンバーターが使用されます。

関連する問題