簡體   English   中英

WPF 將 DataContext 設置為沒有默認構造函數的 ViewModel

[英]WPF set DataContext to a ViewModel without default constructor

我有一個接受多個構造函數參數的ViewModel 據我了解,因此設置 View 的 DataContext 的唯一方法是使用代碼隱藏。

這有其缺點:

  • Visual Studio 不會顯示正在構建的視圖的ViewModel智能
  • 無法查看 XAML 設計器中我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM