2014-07-04 43 views
0

我有一個帶有MVVM模式的WPF項目。使用參數調用視圖構造函數

在後面的代碼,我所說的觀點:

NavigateToViewCommand command = new NavigateToViewCommand(Container.Container.GetA<IProductViewModel>()); 
command.Execute(); 

的NavigateToViewCommand看起來是這樣的:

public class NavigateToViewCommand : WpfCommand 
{ 
    private readonly object _viewToNavigate; 

    public NavigateToViewCommand(object viewToNavigate) : base("Navigate") 
    { 
     _viewToNavigate = viewToNavigate; 
    } 

    protected override void RunCommand(object parameter) 
    { 
     Container.Container.GetA<IMainViewModel>().NavigateToView(_viewToNavigate); 
    } 

    protected override IEnumerable<string> GetPreconditions(object parameter) 
    { 
     yield break; 
    } 
} 

這裏的IProductViewModel接口:

public interface IProductViewModel : IViewModelBase 
{ 
    string Name { get; } 
    IEnumerable<string> Products { get; } 
} 

的IViewModelBase是空的接口它實現了INotifyPropertyChanged接口。 IMainViewModel實現了IViewModelBase接口。

在我看來,我有一個沒有參數的構造函數和參數爲int的構造函數。我想用參數調用構造函數。我怎麼做?

這裏是我WPFCommand類:

public abstract class WpfCommand : ICommand 
{ 
    private readonly string _verb; 

    protected WpfCommand(string verb) 
    { 
     _verb = verb; 
    } 

    public string Verb 
    { 
     get { return _verb; } 
    } 

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

    protected abstract void RunCommand(object parameter); 
    protected abstract IEnumerable<string> GetPreconditions(object parameter); 

    public bool CanExecute(object parameter) 
    { 
     return GetPreconditions(parameter).Count() < 1; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 
} 
+0

在您的第一個代碼片段中,您將獲得一個IProductViewModel實例,該實例可能是您要導航到的視圖模型。你想調用這個IProductViewModel實例的重載構造函數('int')嗎? –

+0

@AndrewStephens是的,IProductViewModel是我想用於我需要的視圖的視圖模型。我想調用ProductView的重載構造函數,而不是視圖模型。 –

+0

你的代碼顯示了你如何得到虛擬機的一個實例,但是它的關聯視圖是如何實例化的?我注意到在你的命令代碼中你調用了IMainViewModel的NavigateToView()方法。它在那裏嗎? –

回答

0

綜觀上述意見提到,CodeProject上的文章,你似乎可以用一個VM-第一種方法:使用IoC容器,讓您的虛擬機實例,但視圖是數據模板。當您導航到特定的虛擬機時,WPF框架將使用相關的數據模板(因此查看)虛擬機類型,因此您不太可能掛鉤到視圖的創建過程中。即使可以,將int傳遞給ctr可能是不明智的,尤其是在依賴注入環境中。

相反,你可以暴露int爲你的虛擬機的屬性,然後在視圖的訪問值後臺代碼是這樣的: -

// Assumes the int property is called ProductId 
var productId = (DataContext as IProductViewModel).ProductId; 

你可能會發現你不能做到這一點在視圖的構造函數中,因爲DataContext在ctr被調用之後才分配。