亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 MVVM 中使用相同的 ViewModel 擁有多個視圖?

如何在 MVVM 中使用相同的 ViewModel 擁有多個視圖?

C#
肥皂起泡泡 2021-10-31 19:15:53
我是 WPF 和 MVVM 的新手,并且在嘗試DataContext在兩個單獨的視圖中將其設置為我的 ViewModel 的同一實例時遇到了一個問題。這是因為:<Window.DataContext>     <local:ViewModel/>     </Window.DataContext>將為每個視圖創建一個新的視圖模型實例。為了解決這個問題,我決定創建一個類來存儲我使用的每個 ViewModel 的靜態實例。然后在cs每個視圖的文件中,我DataContext將從這個靜態類設置為適當的 ViewModel。這行得通,但對于可能同時需要多個 ViewModel 實例的大型程序來說,這似乎不是最好的主意。有什么更好的方法可以解決這個問題 - 是否有使用同一個 ViewModel 實例擁有多個視圖的合理方法?或者這種方法是不好的做法 - 我應該為每個 ViewModel 設計一個具有一個視圖的程序嗎?
查看完整描述

3 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

您可以在 App.xaml 中實例化該視圖模型,以便整個應用程序都可以訪問它。


<Application.Resources>

    <local:ViewModel x:Key="sharedViewModel" />

</Application.Resources>

然后在您想要使用該數據上下文時的視圖中,您執行以下操作...


DataContext="{StaticResource sharedViewModel}"


查看完整回答
反對 回復 2021-10-31
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

我有同樣的問題,但找不到好的答案。經過一段時間的思考,我得出的結論是,在大多數情況下,最好在視圖模型和視圖之間創建一對一的映射。因此,在這種情況下,我將創建兩個獨立的視圖模型,它們繼承自基本視圖模型。這樣你就可以在基本視圖模型中放置任何常見的東西,并添加任何可能與更具體的視圖模型不同的字段或方法。如果視圖模型真的是等效的,那么您可能首先要問自己為什么有兩個單獨的視圖。您可以考慮將它們合并為一個視圖。有兩個單獨的視圖可能是您想要的,但這只是需要考慮的事情。


查看完整回答
反對 回復 2021-10-31
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

實現 ViewModelLocator 既簡單又容易,也是推薦的方法之一。


Idea 已經在 ViewModelLocator 類中定義了所有的 ViewModel,并在需要的地方訪問 ViewModel。在不同的視圖中使用相同的 ViewModel 在這里不會有問題。


    public class ViewModelLocator

{

         private MainWindowViewModel mainWindowViewModel;

  public MainWindowViewModel MainWindowViewModel

    {

        get

        {

            if (mainWindowViewModel == null)

                mainWindowViewModel = new MainWindowViewModel();


            return mainWindowViewModel;

        }

    }

    private DataFactoryViewModel dataFactoryViewModel;

 public DataFactoryViewModel DataFactoryViewModel

    {

        get

        {

            if (dataFactoryViewModel == null)

                dataFactoryViewModel = new DataFactoryViewModel();


            return dataFactoryViewModel;

        }

    }

}

應用程序.xaml


    xmlns:core="clr-namespace:MyViewModelLocatorNamespace"


<Application.Resources>

    <core:ViewModelLocator x:Key="ViewModelLocator" />

</Application.Resources>

用法


<Window ...

  DataContext="{Binding Path=MainWindowViewModel, Source={StaticResource ViewModelLocator}}">

參考:所以問題 代碼從那里復制..因為我無法從我的項目中撕下代碼..


查看完整回答
反對 回復 2021-10-31
  • 3 回答
  • 0 關注
  • 412 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號