2017-03-17 1 views
-1

auf Ich arbeite mit benutzerdefiniertem Steuerelement, das 3D gerenderte Daten für den Benutzer anzeigt. Das Steuerelement verfügt über eine ResetView() - Methode, die den Status des Steuerelements auf seine Standardwerte zurückgibt. Ich habe ein View-Modell, das der Datenkontext für das Fenster ist, also wie würde ich die ResetView-Methode des Steuerelements aufrufen, wenn auf eine Schaltfläche in derselben Ansicht geklickt wird und die MVVM-Struktur beibehalten wird?So rufen Sie die Methode eines benutzerdefinierten Steuerelements über einen Befehl in WPF

+1

'button.Click' und' control.ResetView() 'beinhalten keine VM überhaupt. Sie können 'control.ResetView()' im Click-Handler im Code hinterher ausführen, da es sich um eine interne Ansicht handelt. – ASh

+0

auf dem zweiten Gedanken, wenn Contol an VM gebunden ist, sollte Vm wahrscheinlich 'Reset'-Methode haben und' ResetCommand' für button.Command binding – ASh

+0

yeah Ich bin mir bewusst, dass Button Klicks sind nicht MVVM, durch Klicken, was ich meine der commnd, der an den Button – user3519506

Antwort

0

Ein möglicher Ansatz, den ich verwende in der Regel: Ihrer Ansicht nach Modell

eine Eigenschaft vom Typ IObservable erstellen. Sie können Betreff von Reaktive Erweiterungen (RX) als eine tatsächliche Implementierung verwenden.

public class ViewModel 
{ 
    private Subject<Unit> _resetRequest = new Subject<Unit>(); 

    public IObservable<Unit> ResetRequest 
    { 
     get { return _resetRequest; } 
    } 
} 

Erstellen Sie ein Verhalten für die Steuerung. Das Verhalten muss an Ihre Eigenschaft gebunden sein und das Observable abonnieren. Rufen Sie die ResetView() - Methode Ihres Steuerelements aus dem Abonnement OnNext-Handler auf.

public class ResetViewBehavior : Behavior<YourControl> 
{ 
    private IDisposable _subscription; 

    public static readonly DependencyProperty RequestProperty = DependencyProperty.Register("Request", typeof(IObservable<Unit>), typeof(ResetViewBehavior), new PropertyMetadata(null, OnRequestChanged)); 

    public IObservable<Unit> Request 
    { 
     get { return (IObservable<Unit>)GetValue(RequestProperty); } 
     set { SetValue(RequestProperty, value); } 
    } 

    private static void OnRequestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((ResetViewBehavior)d).Resubscribe(); 
    } 

    private void Resubscribe() 
    { 
     _subscription?.Dispose(); 
     _subscription = Request?.Subscribe(_ => AssociatedObject.ResetView()); 
    } 

    protected override void OnAttached() 
    { 
     Resubscribe(); 
    } 

    protected override void OnDetaching() 
    { 
     _subscription?.Dispose(); 
    } 

} 

In XAML:

<Window> 
     <YourControl> 
      <i:Interaction.Behaviors> 
       <b:ResetViewBehavior Request="{Binding ResetRequest}" /> 
      </i:Interaction.Behaviors> 
     </YourControl> 
    </Window> 

Motivs Aufruf OnNext Methode aus Sicht Modell, wenn Sie die Ansicht zurücksetzen möchten.

Mit diesem Ansatz haben Sie keinen Code hinter sich, den ich persönlich in MVVM immer vermeiden möchte. Stattdessen verkapseln Sie Ihre Logik im wiederverwendbaren Verhalten.

Sie können auch einige Daten an die Methoden des Steuerelements übergeben, wenn Sie eine andere Klasse als Unit als IObservable-Parameter verwenden.

+0

Vielen Dank dafür, ich werde einen Blick darauf werfen, es umzusetzen. – user3519506

Verwandte Themen