[英]WPF set DataContext to a ViewModel without default constructor
我有一個接受多個構造函數參數的ViewModel
。 據我了解,因此設置 View 的 DataContext 的唯一方法是使用代碼隱藏。
這有其缺點:
ViewModel
智能ViewModel
構造函數中定義的設計時數據,因為設計器只是中斷我有哪些選擇?
我想要一個ViewModel
,它可以接受構造函數參數,具有設計時數據,並且我的 Visual Studio inteliscence 會為我提供有關ViewModel
中成員的建議,這樣我就可以獲得良好的設計體驗。
附言。 我正在使用 Microsoft 的MVVM Toolkit / Windows Community Toolkit ,但對於如何實現我的最終目標的任何答案,我將不勝感激。 謝謝你。
我有哪些選擇?
一種常見的方法是使用無參數構造函數創建單獨的設計時視圖 model class 並將設計時數據上下文設置為此類型:
<Window ... d:DataContext="{d:DesignInstance Type=local:DesignTimeViewModel, IsDesignTimeCreatable=True}"
你不應該做的是根據 Visual Studio 中設計器的工作方式來設計你的應用程序並定義你的類。
將帶有參數化構造函數的視圖模型分配為視圖的數據上下文的最簡潔方法是使用ViewModelLocator
模式。
public class ViewModelLocator
{
public ViewModelLocator()
{
// define view-model definitions in IoC container.
}
public MainViewModel MainViewModel
{
get
{
// use the appropriate construct for your choice of IoC container
var result = IoCContainer.GetInstance<MainViewModel>();
return result;
}
}
}
這個 class 的實例可以在 App.xaml 中創建
<Application.Resources>
<local:ViewModelLocator x:Key="ViewModelLocator">
</Application.Resources>
它成為一個應用程序范圍的資源,可以在每個視圖中引用。
現在我們可以隨時獲取特定視圖模型的實例,包括在設計器中,並將其分配為視圖的 DataContext。
<Window
x:Class="MyApplication.MainView"
...
DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=MainViewModel}" />
有關使用此 ViewModelLocator 模式的更多詳細信息,包括在您的 ViewModel 中包含設計時數據,請查看我的博客文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.