Wie übergebe ich eine Variable als CommandParameter

7

Ich versuche, eine Variable aus dem ViewModel als Parameter an einen Befehl zu senden. Der Befehl sieht so aus:

%Vor%

Das ViewModel sieht folgendermaßen aus:

%Vor%

Das Xaml sieht so aus:

%Vor%

Ich habe versucht, eine Eigenschaft im ViewModel zu erstellen, anstatt den privaten lokalen Variablennamen zu verwenden, aber das hat auch nicht funktioniert. Das object parameter zeigt immer null im Aufruf von CanExecute und die Schaltfläche ist niemals aktiviert. Wenn ich den Wert CommandParameter in Hello ändere, dann erhalte ich Hello im Aufruf von CanExecute , also bin ich mir nicht sicher, warum die Variable nicht funktioniert. Jede Hilfe wäre willkommen.

Update: Ich habe auch versucht, dem Modell eine öffentliche Eigenschaft zuzuweisen (die ich nicht wirklich dem Modell aussetzen möchte, aber ich habe es einfach versucht, um zu sehen, ob es funktioniert, aber es tut es nicht).

%Vor%

Und das Xaml wurde folgendermaßen geändert:

%Vor%

Aber immer noch kein Glück. Das ViewModel implementiert INotifyPropertyChanged

    
SwDevMan81 11.09.2012, 13:49
quelle

4 Antworten

13

Ist CommandParameter immer Null oder überprüfen Sie nur das erste Mal, wenn es ausgeführt wird?

Es scheint, dass die Reihenfolge, in der Sie Ihre Eigenschaften deklarieren, in diesem Fall von Bedeutung ist, da das Festlegen der Eigenschaft Command bewirkt, dass CanExecute unmittelbar vor dem Festlegen des CommandParameters ausgelöst wird.

Versuchen Sie, die CommandParameter-Eigenschaft vor der Command-Eigenschaft zu verschieben:

%Vor%

Siehe auch hier und hier .

Bearbeiten

Um sicherzustellen, dass Ihre Ereignisse ordnungsgemäß ausgelöst werden, sollten Sie das CanExecuteChanged-Ereignis auslösen, wenn sich der PersonModelProp -Wert ändert.

Der Befehl:

%Vor%

Und das Ansichtsmodell:

%Vor%     
Dylan Meador 11.09.2012, 14:21
quelle
7
___ antwort12371905 ___

Zwei Punkte zur Antwort:

Erstens können Sie, wie von @akton erwähnt, nur an public properties binden. muss jedoch nicht DependencyProperty sein.

Zweitens brauchte ich etwas Zeit, um herauszufinden, dass Sie die Bindung für CommandParameter vor die Eigenschaft Befehl festlegen müssen . d. h.

%Vor%

Hoffe das hilft:)

    
___ answer12371891 ___

Ist CommandParameter immer Null oder überprüfen Sie nur das erste Mal, wenn es ausgeführt wird?

Es scheint, dass die Reihenfolge, in der Sie Ihre Eigenschaften deklarieren, in diesem Fall von Bedeutung ist, da das Festlegen der Eigenschaft Command bewirkt, dass CanExecute unmittelbar vor dem Festlegen des CommandParameters ausgelöst wird.

Versuchen Sie, die CommandParameter-Eigenschaft vor der Command-Eigenschaft zu verschieben:

%Vor%

Siehe auch hier und hier .

Bearbeiten

Um sicherzustellen, dass Ihre Ereignisse ordnungsgemäß ausgelöst werden, sollten Sie das CanExecuteChanged-Ereignis auslösen, wenn sich der %code% -Wert ändert.

Der Befehl:

%Vor%

Und das Ansichtsmodell:

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ qstntxt ___

Ich versuche, eine Variable aus dem ViewModel als Parameter an einen Befehl zu senden. Der Befehl sieht so aus:

%Vor%

Das ViewModel sieht folgendermaßen aus:

%Vor%

Das Xaml sieht so aus:

%Vor%

Ich habe versucht, eine Eigenschaft im ViewModel zu erstellen, anstatt den privaten lokalen Variablennamen zu verwenden, aber das hat auch nicht funktioniert. Das %code% zeigt immer %code% im Aufruf von %code% und die Schaltfläche ist niemals aktiviert. Wenn ich den Wert %code% in %code% ändere, dann erhalte ich %code% im Aufruf von %code% , also bin ich mir nicht sicher, warum die Variable nicht funktioniert. Jede Hilfe wäre willkommen.

Update: Ich habe auch versucht, dem Modell eine öffentliche Eigenschaft zuzuweisen (die ich nicht wirklich dem Modell aussetzen möchte, aber ich habe es einfach versucht, um zu sehen, ob es funktioniert, aber es tut es nicht).

%Vor%

Und das Xaml wurde folgendermaßen geändert:

%Vor%

Aber immer noch kein Glück. Das ViewModel implementiert %code%

    
___ tag123wpf ___ Windows Presentation Foundation oder WPF ist ein Subsystem zum Rendern von Benutzeroberflächen in Windows-basierten Anwendungen. ___ tag123command ___ Ein Befehl ist eine Anweisung an ein Computerprogramm, das als Interpreter einer Art fungiert, um eine bestimmte Aufgabe auszuführen. Meistens ist ein Befehl eine Direktive für eine Art von Befehlszeilenschnittstelle, z. B. eine Shell. Verwenden Sie [Befehlsmuster] für das Entwurfsmuster. ___ tag123mvvm ___ Model-View-ViewModel (MVVM) ist ein Architekturentwurfsmuster zum Implementieren von Benutzeroberflächen, das die Benutzeroberfläche (die Ansicht) von ihren Daten (dem Modell) über ihre Präsentationslogik (ihr ViewModel) trennt. ___ answer12371301 ___

%code% ist privat und kann daher nicht aufgerufen werden. Erstellen Sie eine öffentliche Eigenschaft, die sie verfügbar macht und binden Sie diese in %code% . Denken Sie daran, die Eigenschaft zu einer Abhängigkeitseigenschaft zu machen (technisch nicht erforderlich, aber hilfreich), und das ViewModel sollte INotifyProperty implementieren und das PropertyChanged-Ereignis auslösen, damit die Bindung aktualisiert wird.

    
___ answer12372399 ___

Ich denke, Sie haben ein Problem in Ihrem EditPersonCommand (es hat nicht gefeuert ok). Ich überprüfe es mit relayCommand und es funktioniert!

Dies ist der Code:

ViewModel:

%Vor%

Und dieser RelayCommand (Fire events ok!)

%Vor%

Xmal:

%Vor%     
___ tag123commandparameter ___ hilf uns dieses Wiki zu bearbeiten ___ qstnhdr ___ Wie übergebe ich eine Variable als CommandParameter ___
AbdouMoumen 11.09.2012 14:22
quelle
4

_PersonModel ist privat und kann daher nicht aufgerufen werden. Erstellen Sie eine öffentliche Eigenschaft, die sie verfügbar macht und binden Sie diese in CommandParameter . Denken Sie daran, die Eigenschaft zu einer Abhängigkeitseigenschaft zu machen (technisch nicht erforderlich, aber hilfreich), und das ViewModel sollte INotifyProperty implementieren und das PropertyChanged-Ereignis auslösen, damit die Bindung aktualisiert wird.

    
akton 11.09.2012 13:51
quelle
2

Ich denke, Sie haben ein Problem in Ihrem EditPersonCommand (es hat nicht gefeuert ok). Ich überprüfe es mit relayCommand und es funktioniert!

Dies ist der Code:

ViewModel:

%Vor%

Und dieser RelayCommand (Fire events ok!)

%Vor%

Xmal:

%Vor%     
ígor 11.09.2012 14:46
quelle