gpt4 book ai didi

wpf - 约什史密斯的传奇文章 : I need a bit more on the DataBinding that takes place

转载 作者:行者123 更新时间:2023-12-02 00:17:35 26 4
gpt4 key购买 nike

关于the MSDN article of Josh Smith on MVVM和示例应用程序。我知道关于这个话题有很多关于 SO 的问题,我已经探索了所有问题。他们中的大多数都专注于 MVVM,但我认为我的问题是 XAML 比 MVVM 更相关。

示例应用程序包含工作区区域的以下 XAML -

<Border Grid.Column="2" Style="{StaticResource MainBorderStyle}">
<ContentControl Content="{Binding Path=Workspaces}" ContentTemplate="{StaticResource ResourceKey=WorkspacesTemplate}"/>
</Border>

相关资源是——

//Explains how to render the 'Workspace' content area in the main window
<DataTemplate x:Key="WorkspacesTemplate">
<TabControl Margin="4" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True"
ItemTemplate="{StaticResource ResourceKey=ClosableTabItemTemplate}"/>
</DataTemplate>

//Explains how to render a tab item with a close button
<DataTemplate x:Key="ClosableTabItemTemplate">
<DockPanel Width="120">
<Button Command="{Binding Path=CloseCommand}" Content="X" Cursor="Hand"
DockPanel.Dock="Right" Focusable="False" FontFamily="Courier"
FontSize="9" FontWeight="Bold" Margin="0,1,0,0" Padding="0"
VerticalContentAlignment="Bottom" Width="16" Height="16"/>
<ContentPresenter Content="{Binding Path=DisplayName}" VerticalAlignment="Center"/>
</DockPanel>
</DataTemplate>

我还是不明白-

  • 语法 ItemsSource="{Binding}" 应该将 ItemsSource 直接绑定(bind)到 TabControl 的 DataContext,而不是绑定(bind)到 DataContext 的任何属性。但是 TabControl 的 DataContext 到底在哪里设置?
  • Content="{Binding Path=Workspaces}" 如何在 TabControl 的 ItemsSource 和工作区(WorkspaceViewModel 的 ObservableCollection)之间创建绑定(bind)?
  • 文章说通过依赖数据绑定(bind),TabItemContent 属性接收一个 ViewModelBase 派生对象来显示。如何 ?!?好的,通过数据绑定(bind)。但对我来说,这实在是太抽象了。

一般来说,我错过了绑定(bind)在幕后流过/处理这两个资源的方式以加载 TabItems 中的 View 。对我来说,这就像是,是什么导致什么被绑定(bind)到什么

这篇传奇文章和示例应用程序对 WPF/MVVM 初学者非常有用。但这并没有太多的阐述。我自己已经学会了将 MVVM 与这个一起使用。我认为 并且 将是 一些像我一样的人。那么,任何人都可以更详细地解释一下绑定(bind)序列吗?

相关说明:

也许它会给你一些我在这方面已经知道的东西的提示,并帮助你回答。我是初级 WPF 应用程序开发人员。以我对 XAML 的不太好知识 -

  • 我通过 typed-DataTemplate 了解当出现 ViewModel 类型时显示 View,然后将 ViewModel 设置为该 View 的 DataContext 的神奇之处
  • 我的理解是,内容告诉什么在 ContentControl 上显示,而 ContentTemplate 告诉如何显示该内容。
  • 我对基本的数据绑定(bind)概念略有了解,并且参与过一些 WPF/MVVM 项目。

最佳答案

The syntax ItemsSource="{Binding}" should bind the ItemsSource directly to the TabControl’s DataContext, rather than to any of the DataContext’s properties. But where exactly is the TabControl’s DataContext being set?

由于是数据模板,TabControl 将其 DataContext 设置(由 WPF)为其模板化的数据项。事实上,数据模板中的根级项将具有由 WPF 设置的 DataContext。在本例中,它是一个 TabControl

由于数据模板被分配给ContentControlContentTemplate属性,它会自动接收ContentControlContent 作为它的 DataContext

How exactly is Content="{Binding Path=Workspaces}" creating a binding between ItemsSource of the TabControl and the Workspaces (the ObservableCollection of WorkspaceViewModel)?

我认为我之前的回答解决了这个问题,但让我以直接回答这个问题的形式重申一下。 ContentControl 上的绑定(bind)可确保将 DataTemplateDataContext 设置为工作区集合。因此,TabControl 可以通过指定一个没有 PathBinding 来绑定(bind)到工作区集合。

The article says By relying on data binding, the Content property of a TabItem receives a ViewModelBase-derived object to display. How ?!? Ok, through data binding. But that is just too much to abstract away, for me.

同样,这归结为 WPF 自动分配正确的对象作为生成项的数据上下文(在本例中为 TabItem)。当 ItemsControl(例如 TabControl)绑定(bind)到集合时,它会为集合中的每个项目生成一个容器(在本例中为 TabItem)绑定(bind)的集合。容器自动接收数据项(在本例中为工作区 View 模型)作为其数据上下文。

关于wpf - 约什史密斯的传奇文章 : I need a bit more on the DataBinding that takes place,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12388402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com