Übergeben eines Parameters RelayCommand im Ansichtsmodell definiert wurden (von Jos Smith Beispiel)

StackOverflow https://stackoverflow.com/questions/810208

Frage

Ich mag einen Parameter in der XAML (View) von meiner Anwendung auf die Ansichtsmodell Klasse definiert passiere durch den RelayCommand verwenden. Ich folgte Josh Smith ausgezeichneten Artikel über MVVM und umgesetzt haben folgendes .

XAML-Code

        <Button 
        Command="{Binding Path=ACommandWithAParameter}"
        CommandParameter="Orange"
        HorizontalAlignment="Left" 
        Style="{DynamicResource SimpleButton}" 
        VerticalAlignment="Top" 
        Content="Button"/>

Ansichtsmodell-Code

  public RelayCommand _aCommandWithAParameter;
  /// <summary>
  /// Returns a command with a parameter
  /// </summary>
  public RelayCommand ACommandWithAParameter
  {
     get
     {
        if (_aCommandWithAParameter == null)
        {
           _aCommandWithAParameter = new RelayCommand(
               param => this.CommandWithAParameter("Apple")
               );
        }

        return _aCommandWithAParameter;
     }
  }

  public void CommandWithAParameter(String aParameter)
  {
     String theParameter = aParameter;
  }
  #endregion

setzte ich einen Haltepunkt in dem CommandWithAParameter Verfahren und beobachtete, dass aParameter eingestellt wurde auf „Apple“, und nicht „Orange“. Dies scheint offensichtlich, wie die Methode CommandWithAParameter mit der Zeichenkette „Apple“ genannt zu werden.

Um jedoch die Ausführungsstapel nach oben, kann ich sehen, dass „Orange“, die Command ich in der XAML-Set für RelayCommand Implemenation der ICommand Execute Interface-Methode der Parameterwert ist.

Das ist der Wert des Parameters in dem Verfahren unterhalb der Ausführungsstapel „Orange“,

  public void Execute(object parameter)
  {
     _execute(parameter);
  }

Was ich versuche, ist, herauszufinden, wie die RelayCommand ACommandWithAParameter Eigenschaft erstellen, dass sie die CommandWithAParameter Methode mit dem Command „Orange“ in der XAML definiert aufrufen können.

Gibt es eine Möglichkeit, dies zu tun?

Warum muss ich dies tun wollen? Ein Teil der „On The Fly Lokalisierung“ In meinem speziellen Implementierung möchte ich eine SetLanguage RelayCommand erstellen, die auf mehrere Tasten gebunden werden können. Ich möchte die zwei Zeichensprachenkennung übergeben ( „en“, „es“, „ja“, etc) als Command und habe, dass für jede „eingestellte Sprache“ in der XAML definiert definiert werden. Ich möchte zu vermeiden, einen SetLanguageToXXX Befehl für jede Sprache erstellen Unterstützung und harte Codierung der zwei Zeichensprachenkennung in jede RelayCommand im Ansichtsmodell.

War es hilfreich?

Lösung

Ich verstehe nicht, warum Sie die zusätzliche Komplexität haben das Lambda in erster Linie anzugeben. Warum nicht einfach dies tun:

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand<object>(CommandWithAParameter);
}

private void CommandWithAParameter(object state)
{
    var str = state as string;
}

Andere Tipps

Sie werden den param im Lambda auf den Befehl übergeben wie folgt:

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand(               
        param => this.CommandWithAParameter(param)
        );        
}

Nichts geschrieben hier gearbeitet für mich.

Es stellte sich heraus, alle Antworten die <object> nach RelayCommand fehlen!

Dies funktioniert für mich:

public RelayCommand<object> OKCommand
{
    get
    {
        if (_okCommand == null)
            _okCommand = new RelayCommand<object>(OkCommand_Execute);
        return _okCommand;
    }
}
private RelayCommand<object> _okCommand = null;

private void OkCommand_Execute(object obj)
{
    Result = true;
}

Wenn Sie aCanExecute Methode verwenden möchten, verwenden Sie den folgenden Code ein:

_okCommand = new RelayCommand<object>(OkCommand_Execute, OkCommand_CanExecute);

private bool OkCommand_CanExecute(object obj) { }

ich gerade versuche, meinen Punkt zu verkaufen, check this out, ob das funktioniert ...

http: // mywpf- visu.blogspot.com/2009/12/relay-command-how-to-pass-parameter.html

Hier ist eine einfache Lösung für die Commandparameter wie ich um Hilfe zu diesem Thema gesucht. Ich konnte nichts online finden, die einfach genug war. Die folgende Lösung funktioniert gut, wenn Sie einen relaycommand verwenden. Ich hatte ein paar Hyperlinks für die ich benötigt, um den URL-Wert zu erhalten, der den Befehl Parameter angeklickt wurde mit.

Schritt 1: In Ihrem Relais-Befehl, eine einfache Eigenschaft erstellen, die den Parameter Objektwert halten werden. Sie könnten nennen es parameter oder einen beliebigen Namen, die Sie bevorzugen.

public object ParameterValue
{
  get;
  set;
}

. Schritt 2: In der Execute-Methode der Klasse RelayCommand, den Wert oder die oben aus der Execute-Methode auf den Parameter erzeugte Eigenschaft

readonly Action<object> m_execute;       // Action to execute

public void Execute(object parameter)
 {
   this.ParameterValue = parameter;
   m_execute(parameter);
 }

Schritt 3: Nun, wenn Sie die Commandparameter in XAML auf einen beliebigen Wert binden können Sie abrufen möchten, wenn der Befehl ausgeführt wird. Beispiel:

<TextBlock>
  <Hyperlink Command="{Binding Path=NavigateUrlCmd}"
             CommandParameter="{Binding ElementName=tbwebsite, Path=Text}">
    <TextBlock Name="tbwebsite" Text="{Binding Path=website}"/>
  </Hyperlink>
</TextBlock> 

Wenn Sie einen Befehl namens chickenCommand, wenn sie ausgeführt werden könnten Sie die Parameter zugreifen: chickenCommand.ParameterValue

Ich hoffe, das jemand hilft. Vielen Dank für all Ihre bisherige Hilfe.

Ich kann nicht einen Verweis auf die Methodennamen für den Lamda-Ausdruck ersetzt einen Compiler-Fehler withing. Offensichtlich und keineswegs überraschend, dass eine nicht-statische Referenzmethode Namen kann nicht anstelle einer Lambda verwendet werden. Ich sehe es kaum als „zusätzliche Komplexität“. Konsequent lamdas vorbei macht Sinn für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top