2016-06-17 6 views
0

Ich habe Probleme, den RelayCommand von MVVM Light in einer WPF-Anwendung zu verwenden, insbesondere wenn ich einen CanExecute-Delegaten verwenden möchte. Wenn ich diesen zweiten Parameter zum Konstruktor des Befehls hinzufüge, wird das MainWindow nie gestartet und ich muss die Anwendung vom Task-Manager beenden. Dieses Problem verschwindet, wenn ich den zweiten Parameter entferne. Ich habe herumgesucht und herausgefunden, dass MVVM Light zu einer portablen Klassenbibliothek wechselte, die einige Probleme mit dem CanExecute-Delegaten verursachte. Ich habe versucht, zu Version 4.2.32.7 von MVVM Light zurückzukehren, und habe auch versucht, den Galasoft.MvvmLight.CommandWpf-Namespace zu verwenden, aber keiner von beiden hat geholfen.Die Verwendung von RelayCommand in MVVM Light mit einem CanExecute-Delegaten führt dazu, dass meine Anwendung nicht gestartet wird

Ich sollte auch erwähnen, dass keine Build-Fehler (es sagt der Build ist erfolgreich) oder Kompilierungsfehler auftreten. Hier finden Sie einige einfache Code, wo ich das Problem gefunden:

public class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
    } 

    private string myString; 
    public string MyString 
    { 
     get { return myString; } 
     set { Set("MyString", ref myString, value); } 
    } 

    private string myOtherString; 
    public string MyOtherString 
    { 
     get { return myOtherString; } 
     set { Set("MyOtherString", ref myOtherString, value); } 
    } 

    private RelayCommand myCommand; 
    public RelayCommand MyCommand 
    { 
     get 
     { 
      return myCommand ?? 
       (myCommand = new RelayCommand(
        () => MyOtherString = MyString, 
        () => MyString.Length > 5)); 
     } 
    } 
} 

Meine Ansicht ist, nur zwei Textfelder: eine gebunden MyString und ein bis MyOtherString gebunden. Es gibt auch eine Schaltfläche, die an MyCommand gebunden ist. Weiß jemand, warum die Verwendung des CanExecute-Parameters meine Anwendung bricht?

Antwort

0

Die MyString-Eigenschaft in Ihrem Ansichtsmodell ist während des Starts null und es wird NULL-Verweis ausgegeben. Überprüfen Sie also entweder den CanExecute oder weisen Sie der MyString-Eigenschaft den Standardwert zu. Siehe untenstehenden Code.

public class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
    } 

    private string myString = string.Empty; 
    public string MyString 
    { 
     get { return myString; } 
     set { Set("MyString", ref myString, value); } 
    } 

    private string myOtherString; 
    public string MyOtherString 
    { 
     get { return myOtherString; } 
     set { Set("MyOtherString", ref myOtherString, value); } 
    } 

    private RelayCommand myCommand; 
    public RelayCommand MyCommand 
    { 
     get 
     { 
      return myCommand ?? 
       (myCommand = new RelayCommand(
        () => MyOtherString = MyString, 
        () => MyString?.Length > 5)); 
     } 
    } 
} 
Verwandte Themen