DetailView aus- und einschalten bei einem Business Object


Auf der Suche nach einer Möglichkeit das Anzeigen des DetailViews aus einem ListView zu unterbinden bin ich auf folgende Möglichkeit gestoßen. Der Controller erstellt im ModelEditor beim ListView Element eine neue Eigenschaft „Show Detailview“. Damit kann man in einem Listview festlegen ob bei einem Doppelklick oder beim öffnen ein Detailview geöffnet werden soll.

Den Controller kann man im Module Projekt unter Controller unterbringen.

using System;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.SystemModule;

namespace MyApplication.Module.Controllers
{
    public class ShowDetailViewFromListViewController : ViewController
    {
        public const string EnabledKeyShowDetailView = "ShowDetailViewFromListViewController";
        protected override void OnActivated()
        {
            base.OnActivated();
            ListViewProcessCurrentObjectController controller = Frame.GetController();
            if (controller != null)
            {
                IModelShowDetailView modelShowDetailView = View.Model as IModelShowDetailView;
                controller.ProcessCurrentObjectAction.Enabled[EnabledKeyShowDetailView] = modelShowDetailView == null ? true : modelShowDetailView.ShowDetailView;
            }
        }
    }
}

Dazu muss man an der Module.cs folgende Änderungen durchführen.

Im ModuleBase müssen folgende Funktionen hinzugefügt werden:

   public override IEnumerable GetModuleUpdaters(IObjectSpace objectSpace, Version versionFromDB)
        {
            ModuleUpdater updater = new DatabaseUpdate.Updater(objectSpace, versionFromDB);
            return new ModuleUpdater[] { updater };
        }

        public override void ExtendModelInterfaces(DevExpress.ExpressApp.Model.ModelInterfaceExtenders extenders)
        {
            base.ExtendModelInterfaces(extenders);
            extenders.Add();
            extenders.Add();
        }

Neue Klasse erstellen für das neue Element im Model:

public interface IModelDefaultShowDetailView : IModelNode
    {
        [DefaultValue(true)]
        bool DefaultShowDetailViewFromListView { get; set; }
    }
    public interface IModelShowDetailView : IModelNode
    {
        bool ShowDetailView { get; set; }
    }
    [DomainLogic(typeof(IModelShowDetailView))]
    public static class ModelShowDetailViewLogic
    {
        public static bool Get_ShowDetailView(IModelShowDetailView showDetailView)
        {
            IModelDefaultShowDetailView defaultShowDetailViewFromListView = showDetailView.Parent as IModelDefaultShowDetailView;
            if (defaultShowDetailViewFromListView != null)
            {
                return defaultShowDetailViewFromListView.DefaultShowDetailViewFromListView;
            }
            return true;
        }
    }

Schreibe einen Kommentar