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