2013-01-01 39 views
1

我在WPF中有一个基本项目。
所有它检索/更新产品。使用WPF/C中的绑定获取更改的数据#

如下面图所示,用户输入的ID,然后将数据根据它显示,并且用户能够改变数据和点击“保存产品”将其保存到该数据库。

The running project

GetProduct(int id)功能所提供的ID检索的产物。
SaveProduct()函数保存更改的字段。

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

我想要做的就是改变的数据,当用户点击“保存产品”按钮。

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

下面是在第一数据类型(产品型号)一个绑定文本框的一个示例:
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ProductId}" Margin="5" Width="150" />

有一个用于每个以下属性:ProductIdProductNameUnitPrice

重要!:Get/SaveProduct()功能在ProductViewModel class,而实际产品类 - 你猜对了 - ProductModelProductViewModel类包含一个包含当前显示的产品的变量。

这个标题是指用于保存信息的按钮 - 这是写在第二数据类型(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页面中的所有“绑定标记”似乎没有定义资源。难道它的来源实际上是DataTemplate中的DataType,它包含绑定的对象?

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

  5. 如果发生双向绑定,我如何从SaveProduct()函数中获取值?我只是指CurrentProduct.ProductName来获取更改的名称吗?

非常感谢大家花时间回答 - 我非常感谢!

回答

1

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

您对这个绑定设置专用的控制特性要去找设置为DataContext对象上的ProductId财产,并相应设置在控制propertys值。

据我所知,文本框的默认绑定模式是TwoWay。 但是在这种情况下,ProductId/Name + UnitPrice不依赖于 属性,因此当文本框中的文本发生更改时,绑定值不会更新/发送回去。 (由于 没有连接到它的事件...)

你并不需要你的对象DependencyProperty内使属性TwoWay结合发生。

数据上下文在我的项目此前从未进行配置,但在我的XAML页面 “绑定标签”似乎不具有已定义的来源。 难道说源代码实际上是包含绑定对象的 DataTemplate中的DataType?

的绑定被你的XAML中设置将使用存储在DataContext内的对象,因此,如果您没有明确设置视图的DataContext,这将是空的。但是,您应该注意DataContext是从其父项继承的。如果您实际上是使用说,CurrentProduct设置内容,则所有属性都可以绑定到您的Product类型。

第二的DataTemplate(在ProductViewModel一个)有这个 ContentControl中标签:

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

什么是它的目的是什么?

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

如果TwoWay绑定发生了,我如何从SaveProduct()函数中得到 的值?我是否只需参考 CurrentProduct.ProductName以获取更改的名称?

没有看到全部的应用程序,我的猜测是,ContentControl被设置为CurrentProduct和你TextBox等。所有绑定到相应的属性,如CurrentProduct.ProductId,等等产品,它你想保存的其实是CurrentProduct。当您在ViewModel中调用保存时,只需访问CurrentProduct并根据需要保存它,其中CurrentProduct.PropertyName将包含从UI传播的更改。

+0

对不起,我刚刚发现'DataContext'已被设置。它被设置为包含'CurrentProduct'的'ProductViewModel'的一个实例。它就像你说的那样工作! :)我仍然有一个小问题,虽然...根据你解释它的使用情况,{Binding ProductId}不等于{Binding Path = ProductId} – Asaf

+0

是的,但是'路径'是隐含的,因此它不是_explicitly_需要的。 –

+0

好的...和'CurrentControl' ...我得到它保存了'CurrentProduct'对象,因为它的内容,但它会发生什么?它在用户界面中也不可见... – Asaf

相关问题