簡體   English   中英

使用MVVM在WPF中進行實例綁定

[英]Instance binding in WPF with MVVM

我是WPFMVVM模式的新手,並且對如何實現與現有實例的data-binding有些困惑。 我了解在MVVM您具有Model="business logic"ViewModel="presentation logic"View="actual presentation"

不幸的是,我目前無法弄清楚如何將View綁定到ViewModel和相應Model的現有實例。 例如,我找到了我喜歡的MVVM教程 ,但它也只是Model inside the ViewModel創建了Model inside the ViewModel

那么,如何使用底層應用程序中以前實例化的模型呢?

編輯 :因此,我正在嘗試在一個小型測試項目中嘗試使用Gusdor提出的方法,但無法使其起作用。 我收到錯誤消息'WpfBindingTesting.App.MyViewModel' is a 'field', but used like a 'type'在App.xaml.cs中'WpfBindingTesting.App.MyViewModel' is a 'field', but used like a 'type' (請參見下文)。 我希望有人知道我在做什么錯。 這是我的代碼:

ViewModel:

namespace WpfBindingTesting
{
    class ViewModel
    {
        private List<string> names;
        public List<string> Names
        {
            get { return names; }
            set { names = value; }
        }

        public ViewModel()
        {
            Names = new List<string> { "string1", "string2", "string3" };
        }
    }
}

MainWindow.xaml.cs:

namespace WpfBindingTesting
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

MainWindow.xaml:

<Window x:Class="WpfBindingTesting.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext = "{Binding RelativeSource={RelativeSource Mode=Self}}"
        >

        <StackPanel>
            <ListBox
                ItemsSource="{Binding Path=Names}"
                Height="50"
                >
            </ListBox>
    </StackPanel>
</Window>

App.xaml.cs:

namespace WpfBindingTesting
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public App(){
            MainWindow View = new MainWindow();
            ViewModel MyViewModel = new ViewModel();
            View.DataContext = MyViewModel; // this give error: 'WpfBindingTesting.App.MyViewModel' is a 'field', but used like a 'type'
            //view.DataContext = new ViewModel();
            //view.Show();
        }
    }
}

一般而言,我們將視圖模型分配給視圖的DataContext屬性。

只要您有對該視圖的引用,就可以從代碼中執行此操作。 這是代碼:

夏普

Window view = new Window();

// add a view model
view.DataContext = new ViewModel() { Title = "View Model 1" };
view.Show();

// add another view model to demonstrate the binding
view.DataContext = new ViewModel() { Title = "View Model 2" };

XAML

窗口的XAML可能看起來像這樣。

<Window Title={Binding Title}>
</Window>

注意在綁定聲明中如何未指定SourceElementName屬性? 這指示Binding使用當前DataContext作為源。

型號 =業務。
View =用戶所見,實際上與邏輯無關(這只是一個謊言,但這是您所追求的)。
ViewModel =將它們粘合在一起的東西。 是您的適配器為View提供所需的模型信息。

我建議您看一下MVVM平台(例如MVVM Light),它為您提供了許多您需要在開始時“免費”進行的工作。

作為指導,這里有3個進行綁定的選項:

  1. 1.1在XAML上,設置DataContext = "{Binding relativeSource={RelativeSource self}}
    1.2在后面的代碼上有一個屬性(您的xaml.cs)
    1.3在構造函數中的InitializeComponent()之前初始化屬性。

  2. 2.1 XAML上的Igonre DataContext 2.2在后面的代碼中,從InitializeComponent();開始InitializeComponent(); 2.3有一行像DataContext = this; 在構造函數2.4中初始化您的屬性

  3. 3.1給窗口或UserControl命名: Name = "MyWindow" (在xaml中)3.2綁定到元素: ItemSource={Binding ElementName = MyWindow, path =... }"
    3.3在構造函數中的InitializeComponent()之前初始化屬性。

最后但並非最不重要的一點是,請閱讀我的文章“ The Big MVVM Template” ,您可以閱讀該文章並為您提供基本的基本知識,此外,您還將在頂部獲得一個運行完整的示例文件:)。

您的問題更多是關於設計,然后是編碼。 我認為,如果您已經有視圖模型的現有實例,並且只想在新視圖中重用/重新分配它們。 那么可能您需要看一下IOC容器(因為實際上您希望在此處進行某種依賴注入)

很簡單,請使用IOC容器維護viewModel的生命周期。 配置容器以根據需要為您提供所需的ViewModel,即新對象或現有視圖模型對象。

Unity容器

在unity Container中,您可以注冊您的對象,並在將來需要時對其進行解析。 使用以下語法simplay:

寄存器:

 1.MyUnityConatiner.RegisterInstance<IMyService>(myDataService);
or
 2.MyContainer.RegisterInstance<IMyService>("Email", myEmailService);

解決:

  1.MyUnityConatiner.Resolve<IMyService>();
or
  2.MyConatiner.Resolve<IMyService>("Email");

我知道這對您來說似乎是一個有點偏離的解決方案,但是如果您學習使用它,您將對問題以及如何重用對象(模型/視圖模型)有不同的看法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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