0

バインドされたデータのプロパティに応じて異なる DataTemplate を表示するリストボックスを実装したいと考えています。

Notificationアイテムごとに個別のクラスを持つのではなく、保持しているデータのみに依存するさまざまな種類の通知を保持できるというクラスがあります。

 public class Notification : Interfaces.IListable
{
    Cache.NotificationType _type;
    public Cache.NotificationType Type
    {
        get {return _type;}
        set
        {
            switch (value)
            {
                case Cache.NotificationType.DocumentAnnouncment:
                    this.FriendlyType = "Document Announcment";
                    break;
                case Cache.NotificationType.DocumentComment:
                    this.FriendlyType = "Document Comment";
                    break;
                case Cache.NotificationType.FileTransfer:
                    this.FriendlyType = "File Transfer Progress";
                    break;
                case Cache.NotificationType.GeneralAnnouncment:
                    this.FriendlyType = "Special Announcment";
                    break;
                case Cache.NotificationType.MeetingAnnouncment:
                    this.FriendlyType = "Meeting Announcment";
                    break;
                case Cache.NotificationType.MeetingComment:
                    this.FriendlyType = "Meeting Comment";
                    break;

            }

            _type = value;
        }
    }

ここでの主なアイデアは、FriendlyTypeプロパティが何であるかに応じて、異なるデータ テンプレートが必要だということです。

したがって、将来の読みやすさのために、質問をより具体的に言い直します。

表示されているリストボックスに応じて、リスト ボックスに異なるデータ テンプレートを実装するにはどうすればよいNotification.FriendlyTypeですか?

4

1 に答える 1

5

あなたが探しているのはDataTemplateSelector:


XAML:

<DataTemplate x:Key="DocumentAnnouncmentTemplate"> ... </DataTemplate>
<DataTemplate x:Key="DocumentCommentTemplate"> ... </DataTemplate>
<DataTemplate x:Key="FileTransferTemplate"> ... </DataTemplate>
<DataTemplate x:Key="GeneralAnnouncmentTemplate"> ... </DataTemplate>
<DataTemplate x:Key="MeetingAnnouncmentTemplate"> ... </DataTemplate>
<DataTemplate x:Key="MeetingCommentTemplate"> ... </DataTemplate>

<local:FriendlyTypeTemplateSelector x:Key="FriendlyTypeTemplateSelector"
  DocumentAnnouncmentTemplate="{StaticResource DocumentAnnouncmentTemplate}"
  DocumentCommentTemplate="{StaticResource DocumentCommentTemplate}"
  FileTransferTemplate="{StaticResource FileTransferTemplate}"
  GeneralAnnouncmentTemplate="{StaticResource GeneralAnnouncmentTemplate}"
  MeetingAnnouncmentTemplate="{StaticResource MeetingAnnouncmentTemplate}"
  MeetingCommentTemplate="{StaticResource MeetingCommentTemplate}" />

...

<ListBox ItemTemplateSelector="{StaticResource FriendlyTypeTemplateSelector}"
  ... />

C# コード:

public class FriendlyTypeTemplateSelector : DataTemplateSelector
{
    public DataTemplate DocumentAnnouncmentTemplate { get; set; }
    public DataTemplate DocumentCommentTemplate { get; set; }
    public DataTemplate FileTransferTemplate { get; set; }
    public DataTemplate GeneralAnnouncmentTemplate { get; set; }
    public DataTemplate MeetingAnnouncmentTemplate { get; set; }
    public DataTemplate MeetingCommentTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var notification = item as Notification;

        if (notification != null)
        {
            switch (notification.FriendlyType)
            {
                case "Document Announcment":
                    return DocumentAnnouncmentTemplate;
                case "Document Comment":
                    return DocumentCommentTemplate;
                case "File Transfer Progress":
                    return FileTransferTemplate;
                case "Special Announcment":
                    return GeneralAnnouncmentTemplate;
                case "Meeting Announcment":
                    return MeetingAnnouncmentTemplate;
                case "Meeting Comment":
                    return MeetingCommentTemplate;
            }
        }

        return base.SelectTemplate(item, container);
    }
}
于 2013-05-23T00:56:10.810 に答える