[英]Instance binding in WPF with MVVM
我是WPF
和MVVM
模式的新手,並且對如何實現與現有實例的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可能看起來像這樣。
<Window Title={Binding Title}>
</Window>
注意在綁定聲明中如何未指定Source
或ElementName
屬性? 這指示Binding使用當前DataContext
作為源。
型號 =業務。
View =用戶所見,實際上與邏輯無關(這只是一個謊言,但這是您所追求的)。
ViewModel =將它們粘合在一起的東西。 是您的適配器為View提供所需的模型信息。
我建議您看一下MVVM平台(例如MVVM Light),它為您提供了許多您需要在開始時“免費”進行的工作。
作為指導,這里有3個進行綁定的選項:
1.1在XAML上,設置DataContext = "{Binding relativeSource={RelativeSource self}}
1.2在后面的代碼上有一個屬性(您的xaml.cs)
1.3在構造函數中的InitializeComponent()
之前初始化屬性。
2.1 XAML上的Igonre DataContext
2.2在后面的代碼中,從InitializeComponent();
開始InitializeComponent();
2.3有一行像DataContext = this;
在構造函數2.4中初始化您的屬性
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 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.