pan*_*nia 2 wpf binding view mvvm viewmodel
并提前感谢您的指导。我是 MVVM 的新手,我一直在通过文章学习。我想我已经走得很远了,但有一件事情似乎让我逃过一劫。我如何(不在后面的代码中使用代码)自动绑定到我想要的视图?据我了解,如果正确完成,这就是模式应该如何工作。我可以使用主窗口 xaml 中的代码实现这一切,我什至正确创建了一个资源字典(因为我可以在直接窗口中访问它)。我只是无法进入“自动化”的下一步。 ' 这可能是我的设计,因为我不熟悉这种模式,所以我完全可以接受我做错了这一切的可能性。这是我所拥有的...
我有一个主窗口。这是一个有 3 行的网格。顶行是菜单。底行是状态栏。中间是一个堆栈面板,根据菜单选择动态加载内容。
我有 2 个视图用于填充此堆栈面板。一个只有一个样式文本框(帮助和关于)。另一个本身就是一个复合视图:一个搜索面板、一个结果网格和一个详细信息面板,所有这些都加载到停靠管理器框架中。
在后面的主窗口代码中,当用户单击菜单选项时,我清除堆栈面板的子项,实例化视图模型,实例化将视图模型传入其中的视图,然后将新视图添加到堆栈的子项中. 这很好用,但我认为它与模式不一致。
正如我提到的,我有资源字典,但我不知道如何将它与堆栈面板相关联。我假设我必须使用绑定,但我无法弄清楚如何绑定到资源字典和/或如何告诉它更改命令视图。
我读过一些文章,这些文章将所有可用的视图模型添加到视图模型中的只读列表中,该列表基本上充当主寡妇和所需的实际视图模型之间的通道。这看起来不错,但我不明白为什么需要资源字典。此外,这些示例是向导实现,在这种情况下,这似乎是一种好方法,但我无法想象为具有 100 个视图模型的应用程序执行此操作。
再次为我的无知感到抱歉,但我希望有人能指出我正确的方向。正如我所说,我已经阅读了大量文章(Josh Smith、Dave Hill 等),但我仍然没有建立联系,所以我希望得到一些具体的指导。(我确实在途中有 WPF Unleashed,但我希望在那之前取得一些进展。)
任何人都可以帮忙吗?
有多种方法可以绑定您的视图模型。
1. 在 XAML 中创建静态资源。
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication2"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:MainViewModel x:Key="MainVM" />
</Window.Resources>
<Grid DataContext="{StaticResource MainVM}">
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
2.在View的构造函数中绑定
我知道你提到不使用背后的代码,但这也是一种选择。只要你不在后面的代码中写任何逻辑,那么你就很好。
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
Run Code Online (Sandbox Code Playgroud)
3. 使用 ViewModelLocator 绑定
您可能想要创建一个视图模型定位器类,该类负责为您的视图提供所需的视图模型。
这是一个视图模型定位器类的简单示例。viewmodel 定位器类公开了一些 viewmodel 属性。稍后我们会将这些属性绑定到视图的数据上下文。
public class ViewModelLocator
{
public ViewModelLocator()
{
this.MainVM = new MainViewModel();
this.AnotherVM = new AnotherViewModel();
}
public MainViewModel MainVM { get; set; }
public AnotherViewModel AnotherVM { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在 App.xaml 中创建视图模型定位器的静态资源,使其可用于应用程序中的所有视图。
<Application x:Class="WpfApplication2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
StartupUri="MainWindow.xaml">
<Application.Resources>
<local:ViewModelLocator x:Key="Locator" />
</Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)
然后,您可以将视图的数据上下文绑定到视图模型定位器的属性。
该示例告诉我们,如果视图模型定位器(MainViewModel 实例)绑定到 Window 的数据上下文,则您正在将 MainVM 属性绑定。
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication2"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding MainVM, Source={StaticResource Locator}}">
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5412 次 |
| 最近记录: |