2011-01-08 1 views
2

私は、List<T>をレンダリングしているItemsControlではなく、No records foundというメッセージを表示する方法を探しています。list.Count == 0バインド時にItemsControlに空のメッセージが表示される<T>が空です!

私はDataTemplateSelectorを使用して、一度WPFでこれをやったが、シルバーがこれをサポートしていないようです!

このUIロジックをbackendではなくXAMLで、またはViewModelでは比較的簡単に使用できます。

TIA
Delwar

答えて

0

カスタムIValueConverterを使用して、ソースリストにItemsControlVisibilityプロパティをバインドすることができます。 IValueConverterの内部では、ソースコレクションの項目数に応じてVisibility.VisibleまたはVisibility.Collapsedを返すことができます。
"No items"メッセージを含むTextBlockには、反対のロジックを使用するコンバータも同じです。

空のリストの問題をDataTemplateSelectorで解決する方法はわかりません。空のテンプレートは、とにかく適用されないためです。 IValueConverterを使用してリストをDataTemplateプロパティにバインドすることで、DataTemplateSelectorと全く同じ動作を実現できます。 しかし、この解決方法を使用すると、コントロールXamlで定義されたDataTemplateを返すことが困難になります。あなたは、しかし、アプリケーションのリソースに格納されたテンプレートを使用することができます。

役立ちますか?

0

私は99%のケースで私のために働くリストボックスのための簡単な解決策を考え出しました。リソースとして設定したら、リストボックスのタグのプロパティを変更して、すべての機能を動作させるだけです。

オリジナルXAML

<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3" Margin="0"> 
    <ScrollViewer x:Name="ScrollViewer" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Margin="0" Padding="0" TabNavigation="{TemplateBinding TabNavigation}"> 
     <ItemsPresenter Margin="0,0" /> 
    </ScrollViewer> 
</Border> 

新しいXAML

<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3" Margin="0"> 
    <Grid > 
     <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource.Count, Converter={StaticResource ListCount2Visibility}}" Foreground="{StaticResource NormalFontBrush}" FontSize="{StaticResource DefaultFontSize}" /> 

     <ScrollViewer x:Name="ScrollViewer" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Margin="0" Padding="0" TabNavigation="{TemplateBinding TabNavigation}"> 
      <ItemsPresenter Margin="0,0" /> 
     </ScrollViewer> 
    </Grid> 
</Border> 

まず、私は新しいグリッドなどのようなテキストボックスが含まれるようにリストボックスのデフォルトのテンプレートを変更します

テキストブロック視認性プロパティは次のようになりますカスタムコンバータと題しListCount2Visibilityにバインドされています。それがある場合ItemSource.Count == 0ならば

public sealed class ListCount2Visibility : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null && (int)value > 0) 
      return "Collapsed"; 
     else 
      return "Visible"; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

値変換のチェックを...、それが目に見えるの可視性を設定します。さもなければ、それはそれを崩壊させます。新しいテキストブロックの

テキストプロパティは、リストボックスのタグプロパティにバインドされます。 (これは理想的ではありませんが、テキストをコントロールに取り込むための最も速い方法です。タグプロパティを他のものに使用すると、これはうまくいきません)。

基本的には、表示するメッセージにタグを設定し、リストに項目がないときは、テキストボックスが表示されます(水平および垂直に中央揃え)。開発中は、リストが空であるためメッセージが表示されます(現在はデザイン時のdatacontextと仮定しています)。

これは本当にすべてです。

必要に応じて、リストボックスのタグプロパティをビューモデルにバインドしてテキストを変更することもできます。だから、アイテムがデータベースから返されている間に "読み込み中...."のようなことをしてから、すべてがロードされた後に "空のリスト"メッセージに変更することができます。 (もちろんビジーインジケーターはおそらくもっと良いでしょう)

関連する問題