2017-05-15 3 views
0

Ich habe zwei Formen: Form1 und Form2. In Form1 .ctor, I am setting the DataContext` wie unter: -Wie man Änderungen an der GUI eines WPF-Formulars anwendet, wenn ViewModel von einem anderen Formular als einem aktualisiert wird, auf dem es erstellt wurde?

public ViewModel1 VM1; 
Public Form1() 
{ 
    InitializeComponent(); 
    VM1=Populate_View_Model();//This method populates the ViewModel 
    this.DataContext = VM1; 
} 

Ich habe ein Ereignis auf dieser Form, die dieses Ansichtsmodell zu einer anderen WPF Form den Strom wird unter

private void cmdButtonTemplate_Click(object sender, RoutedEventArgs e) 
{ 
    ViewModel1 VM1_Clone = GetCloneObject(VM1_Clone); //Create a clone of ViewModel.Needed on Form2 
    new Form2(this, VM1,VM1_Clone); 
} 

Form2 nimmt (diese) Instanz von Form1 und sein aktuelles Ansichtsmodell und ein Klon von Ansichtsmodell wie unter: -

ViewModel1 VM, VM_Clone; 
Form1 Objfrm1; 
public Form2(Form1 ObjectForm1, ViewModel1 OvjVM1, ViewModel1 ObjVM1_Clone) 
{ 
    Frm1 = ObjectForm1; 
    VM = OvjVM1; 
    VM_Clone = ObjVM1_Clone; 
    Objfrm1 = ObjectForm1; 
    this.DataContext = VM_Clone; 
} 

Nun werden Form2 Änderungen VM1_Clone machen. Sobald ich jene Änderungen VM_Clone gemacht habe, habe ich ein Ereignis in Form2, wo ich die VM_Clone zu VM1 bin Einstellung wie unter: -

Form1 Frm1; 
    private void cmdSave_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     VM = VM_Clone; 
    } 

Nun ich die GUI auf Form1 mit dem aktualisierten Ansichtsmodell von Form2 auffrischen wollte , dh VM.But die GUI auf Form1 wird nicht mit neuen Werten des aktualisierten View Model aktualisiert.

Ich habe sogar versucht, das Objekt Instanz von Form1 Einstellung (im Konstruktor von Form2 übergeben wird) mit dem Datacontext von Form1 von Form2 wie unter: -

private void cmdSave_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     //VM1 = VM1_Clone; 
     Objfrm1.DataContext = VM1; 
    } 

Auch diese brachte kein results.Plz sagen, wie Anwenden der Änderungen, die an dem ViewModel eines Formulars vorgenommen werden, wenn das VieModel von einem anderen Formular als dem geändert wird, auf dem es erstellt wird.

+0

Sie sollten allgemeine Informationen zur Verfügung stellen, über die Sie mit dem archivieren möchten. Ich sehe ein bisschen aus, als ob du einen Schnitt machen willst => Logik speichern/löschen. Dafür gibt es wahrscheinlich bessere Wege. –

+0

Ich habe ein ViewModel erstellt auf Form1 und es muss von Form2 aktualisiert werden. Das ViewModel wird in Form2 aktualisiert, aber die Änderungen an ViewModel in Form2 spiegeln sich nicht in der GUI von Form1.Es gibt mehrere Möglichkeiten Dinge immer, aber ich möchte beantworten, wie es in diesem Fall getan werden soll? –

Antwort

0

Für mich sieht es wirklich wie schmutziger Code aus, und ich kann keine elegantere Lösung ohne mehr Infos zur Verfügung stellen. Sie sollten sich das Mvvm-Muster ansehen.

Ich habe ein Ansichtsmodell auf Form1 erstellt und es muss von Form2.The Ansichtsmodell aktualisiert werden soll, in Form2 immer aktualisiert, aber die zu Ansichtsmodell in Form2 vorgenommenen Änderungen spiegeln nicht in der GUI von Form1.There mehr als eine Art, Dinge immer zu tun, aber ich möchte antworten, wie es in diesem Fall gemacht werden soll?

Setzen Sie den Datenkontext von form1 auf vm_clone. Anstatt also VM=VM_Clone oder Objfrm1.DataContext=VM1 tun

private void cmdSave_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    Objfrm1.DataContext=VM_Clone; 
} 

Oder einfach nicht klont nicht Ihr Ansichtsmodell, wenn nicht notwendig, und stattdessen die gleiche Viewmodel-Instanz Ihre Form2 als Datacontext geben.

+0

Es gibt eine Abbrechen-Schaltfläche auf dem zweiten Formular, so dass der Benutzer zu Form1 zurückkehren kann, ohne die Änderungen von Form2 zu beeinflussen. Wenn ich das tue, was Sie sagen, werden die Änderungen in beiden Formularen widergespiegelt, wenn eine Änderung stattfindet auf form2, was ich nicht will, da es auch auf form2 einen cancel Button gibt. –

+0

Dann überschreiben Sie einfach den Datenkontext in der Speichermethode.Dann können Sie in der Cancel-Methode das Formular2 schließen, ohne etwas zu tun. Beachten Sie jedoch, dass Ihre ursprüngliche Ansichtsform unverändert ist! Also, wenn Sie mit diesem Viewmodel von einigen Instanzvariablen arbeiten möchten, müssen Sie sie wechseln, oder ziehen Sie den Datacontext von form1 heraus in diese Variablen. –

Verwandte Themen