2013-01-01 38 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

相關問題