2012-11-08 55 views
2

我有以下幾點:RelayCommand和WeakReference的

public MainViewModel(IDataService dataService) 
{ 
    _dataService = dataService; 

    NotWorkingCommand = new RelayCommand(() => 
    dataService.GetData((item, error) => 
    { 
     if (error != null) 
     { 
      // Report error here 
      return; 
     } 
     WelcomeTitle = item.Title; 
    })); 
} 

是否有人可以解釋爲什麼我RelayCommand會停止一段時間後啓用?我懷疑它與RelayCommand中使用的WeakReference有關,但我沒有使用WeakReference的經驗。如果我使用_dataService.GetData代替,它將起作用。

回答

1

在您的lambda表達式中,dataService.GetData指令將不起作用,因爲變量dataService的範圍僅限於構造函數。

相反,您應該將此引用複製到後臺字段並改爲調用此實例。 如果通過使用_dataService.GetData表示它可以工作,那麼認爲您靠近解決方案。

private readonly IDataService _dataService; 

public RelayCommand NotWorkingCommand { get; private set; } 


public MainViewModel(IDataService dataService) 
{ 
     _dataService = dataService; 

     NotWorkingCommand = new RelayCommand(() => 
     _dataService.GetData((item, error) => 
     { 
      if (error != null) 
      { 
       // Report error here 
       return; 
      } 
      WelcomeTitle = item.Title; 
     })); 
    } 

看來,代表正確地創建,因爲當中繼命令(在構造函數的範圍)產生的參考存在,但它不能在運行時被調用,因爲它不能被正確評估。

+0

感謝您的回答。我不明白的是,它之前一直在工作,直到在RelayCommand中使用WeakReference。在舊版本的Mvvmlight中,WeakReference未被使用。 –

+0

在以前的版本中,RelayCommand上的Execute方法是 'public void Execute(object parameter) { _execute(); }'相比現在'公共虛擬無效執行(對象參數) { 如果(CanExecute(參數) && _execute!= NULL &&(_execute.IsStatic || _execute.IsAlive)) { _execute.Execute( ); } }' –