2009-04-23 53 views
7

我剛剛開始使用WPF中的MVVM模式,並且決定構建我的代碼的最優雅方式是將視圖模型注入到視圖的構造函數中。MVVM - 視圖是否真的需要一個默認構造函數?

這一切都很好,但ReSharper在XAML中給出警告,我的視圖沒有默認的構造函數。我假設這是爲了能夠在需要時在XAML中構建我的視圖,但這只是一個猜測。

通過要求我的視圖在構造函數中使用視圖模型,我放棄了什麼?

編輯:我的觀點的構造是這樣的:

public ExampleView(ExampleViewModel viewModel) 
{ 
    if (viewModel == null) throw new ArgumentNullException("viewModel"); 
    DataContext = viewModel; 
} 

答:我在下面設置,在設計時命名空間包含嘲笑了用於測試和設計時間視圖模型的版本解決支持。

ExampleView.xaml.cs

public ExampleView() 
{ 
    InitializeComponent(); 
} 

public ExampleView(IExampleViewModel viewModel) 
    : this() 
{ 
    DataContext = viewModel; 
} 

ExampleView.xaml

<UserControl 
    x:Class="Wpf.Examples.ExampleView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:DesignTime="clr-namespace:Wpf.Examples.DesignTime"> 

    <UserControl.DataContext> 
     <DesignTime:ExampleViewModel/> 
    </UserControl.DataContext> 

</UserControl> 

回答

8

正如您正確認識到的那樣,要求使用非默認構造函數將會拒絕您使用XAML中的該控件。這也意味着沒有更多的設計支持,你的設計師可能會討厭你。最後你打破各種不錯的數據綁定方案。像使用控件一樣ItemTemplate

作爲缺失設計支持的補救措施,我建議實施一個默認構造函數,創建一個不需要任何基礎結構的模擬視圖模型。這樣,您可以非常優雅地支持設計模式,並將視圖置於XAML文件中(例如,用於測試)會做出明智的決定。

作爲對缺失數據綁定支持的補救措施,您應該思考通過WPF控件的DataContext消費視圖模型是否會更好。這在WPF中是很常見的,只要我可以告訴---將模型傳遞給WPF視圖的預期方式。

+0

無論如何,我在構造函數中設置DataContext,有沒有更好的模式呢? – 2009-04-23 07:14:14

0

假設你不需要設計師的支持,那麼,我認爲沒有理由。

0

爲了保持設計師的支持,你需要一個默認的構造函數。當你定義你自己的構造函數時,你基本上會放棄自動生成的默認構造函數。只要創建一個明確的默認構造函數,你應該沒問題。

相關問題