Announcement

Collapse
No announcement yet.

[CM/MVVM] View Element aus ViewModel ansprechen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [CM/MVVM] View Element aus ViewModel ansprechen

    Hi,

    Ich entwickle eine Oberfläche ( C# MVVM mit CaliburnMicro ), die aktuell permanent wächst und somit viele Daten angezeigt werden.
    Die Daten sind verteilt in Listen und Reitern ( TabItem ). Ich möchte nun auf Basis einer einfachen Berechtigung entscheiden, welche Reiter sichtbar sind.

    Ich öffne also das Tool und es werden 2 TabItems angezeigt. Anhand des NT-Users möchte ich nun entscheiden, das TabItem2 auszublenden.
    Möglich wäre natürlich mit einem Binding und einem ValueConverter zu arbeiten oder auch den Automatismus von CM mit dem IsVisible-Suffix zu verwenden, aber dann wäre ich etwas zu starr, denke ich.
    Es geht am Ende um weitere View-Elemente und ich wollte ungern für jedes Element den Code erstellen müssen.

    Mir schwebt eine Lösung über die Actions von CM vor. Ich habe bspw. einem TabItem für das Loaded-Event eine Action gegeben:
    Code:
    <TabItem Header="Lieferanten Aktivitäten" Name="tabVendorActivity" cal:Message.Attach="[Event Loaded]=[Action HasRightsFor(tabVendorActivity.Name)]">
    In der Methode HasRightsFor schaue ich nun nach, ob die Bezeichnung tabVendorActivity in einer Liste enthalten ist und würde dann gerne die Visibility für den Tab in diesem Beispiel setzen:
    Code:
    public void HasRightsFor( string element_name )
    {
        bool HasRights = UserRightsFor.Contains( element_name );
    
        // setting visibility depending on HasRights ???
    
    }
    Das hätte den Vorteil, dass ich die Methode als Action für jedes Element verwenden kann, das mit Berechtigungen belegt ist.
    Hab ich in die Richtung irgendeine Chance oder ist das der komplett falsche Weg?

    Ich habe auch schon versucht das TabItem selbst zu übergeben, aber dann erhalte ich immer ein Objekt vom Typ ViewModel.
    Selbst wenn ich die View erhalten würde, habe ich keinen Bezug, welches Control die Anfrage gesendet hat.


    Danke für Tipps und Anregungen
    Gruß Arne

    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    Sorry, habe eben eine passable Lösung gefunden:
    Code:
    <TabItem Header="Lieferanten Aktivitäten" Name="tabVendorActivity" cal:Message.Attach="[Event Loaded]=[Action HasRightsFor($executionContext)]">
    Code:
    public void HasRightsFor( object sender )
    {
        Caliburn.Micro.ActionExecutionContext context = (Caliburn.Micro.ActionExecutionContext)sender;
        context.Source.Visibility = !UserRightsFor.Contains(context.Source.Name) ? System.Windows.Visibility.Hidden : System.Windows.Visibility.Visible;
    
    }
    Das funktioniert zumindest wunderbar und biete mir die Flexibilität, die ich gesucht habe
    PHP rocks!
    Eine Initiative der PHP Community

    Comment

    Working...
    X