1

我在 WPF 中有一个基本项目。
它所做的一切都是检索/更新产品。

如下图所示,用户输入一个ID,然后根据它显示数据,用户可以更改数据并单击“保存产品”将其保存到数据库中。

正在运行的项目

GetProduct(int id)函数通过提供的 ID 检索产品。
SaveProduct()函数保存更改的字段。

此外,还有两个 DataTemplate:
1) 对于 ProductModel - 包括 3 个文本框:ProductId、ProductName、UnitPrice。
2) 对于 ProductViewModel - 包括保存/获取按钮 + 一个文本框,供用户输入所需产品的 id。

我要做的是在用户单击“保存产品”按钮时获取更改的数据。

在我看来,最理想的方式是使用Binding.
每个文本框都已绑定,但我不知道如何获取绑定数据。

以下是 FIRST DataType (ProductModel) 中绑定文本框的示例:
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ProductId}" Margin="5" Width="150" />

以下每个属性都有一个ProductIdProductNameUnitPrice

重要提示!Get/SaveProduct()函数在 中ProductViewModel class,而实际的产品类别是 - 你猜对了 - ProductModel。该类ProductViewModel包含一个包含当前显示产品的变量。

这是用于保存信息的按钮 - 它以 SECOND DataType (ProductViewModel) 编写:
<Button Content="Save Product" DockPanel.Dock="Right" Margin="10,2" VerticalAlignment="Center" Command="{Binding Path=SaveProductCommand}" Width="100" />

SaveProductCommand命令只是触发该SaveProduct()功能。

我对整个主题有几个问题:

  1. 像这样使用绑定是什么意思:{Binding ProductId}

  2. 据我所知,文本框的默认绑定模式是双向。但是在这种情况下,ProductId/Name + UnitPrice 不是依赖属性,因此当文本框中的文本发生更改时,绑定的值不会更新/发回是否正确?(因为没有附加事件......)

  3. 我的项目中从未配置数据上下文,但我的 XAML 页面中的所有“绑定标记”似乎都没有定义的源。可能是源实际上是包含绑定对象的DataTypein吗?DataTemplate

  4. SECOND DataTemplate(ProductViewModel 之一)有这个 ContentControl 标签:<ContentControl Margin="10" Content="{Binding Path=CurrentProduct}" />
    它的目的是什么?

  5. 如果发生/确实发生了 TwoWay 绑定,我如何从SaveProduct()函数中获取值?我只是指,说CurrentProduct.ProductName要改名吗?

非常感谢所有花时间回答的人 - 我非常感谢!

4

1 回答 1

1

像这样使用绑定是什么意思:{Binding ProductId}?

您设置了此绑定的特定控件属性将ProductId在对象集上查找属性集,DataContext并相应地在控件中设置属性值。

据我所知,文本框的默认绑定模式是双向。但是在这种情况下,ProductId/Name + UnitPrice 不是依赖属性,因此当文本框中的文本发生更改时,绑定的值不会更新/发回是否正确?(因为没有附加事件......)

您不需要为对象中的属性设置 aDependencyProperty以进行TwoWay绑定。

我的项目中从未配置数据上下文,但我的 XAML 页面中的所有“绑定标记”似乎都没有定义的源。难道源实际上是包含绑定对象的 DataTemplate 中的 DataType?

在 XAML 中设置的绑定将使用存储在 中的对象DataContext,因此如果您没有显式设置DataContext视图的 ,它将为空。但是,您应该注意,它DataContext是从其父级继承的。如果您实际上是通过使用 say, 来设置内容CurrentProduct,那么所有属性都可以根据您的Product类型绑定到。

SECOND DataTemplate(ProductViewModel 一)有这个 ContentControl 标签:

<ContentControl Margin="10" Content="{Binding Path=CurrentProduct}" />

它的目的是什么?

它充当您的容器CurrentProduct,它可以包含一项且仅一项。

如果曾经/确实发生了 TwoWay 绑定,我如何从 SaveProduct() 函数中获取值?我是否只是指说 CurrentProduct.ProductName 来获取更改后的名称?

在没有看到整个应用程序的情况下,我的猜测是ContentControl被设置为CurrentProduct和您的TextBox等。都绑定到各自的属性,例如CurrentProduct.ProductId等...您要保存的产品实际上是CurrentProduct. 当您在 ViewModel 中调用 save 时,您只需CurrentProduct根据需要访问并持久保存它,其中CurrentProduct.PropertyName将包含从 UI 传播的更改。

于 2013-01-01T21:10:16.240 回答