1

私はWPFで基本的なプロジェクトを持っています。
製品を取得/更新するだけです。

下の画像に示すように、ユーザーが ID を入力すると、それに応じてデータが表示されます。ユーザーはデータを変更し、[製品を保存] をクリックしてデータベースに保存することができます。

実行中のプロジェクト

このGetProduct(int id)関数は、提供された ID によって製品を取得します。
関数はSaveProduct()変更されたフィールドを保存します。

また、2 つの DataTemplates があります
。1) ProductModel の場合 - ProductId、ProductName、UnitPrice の 3 つのテキストボックスが含まれます。
2) ProductViewModel の場合 - 保存/取得ボタン + ユーザーが目的の製品の ID を入力するためのテキストボックスが含まれます。

私がやろうとしているのは、ユーザーが [製品を保存] ボタンをクリックしたときに変更されたデータを取得することです。

私の意見では、最も理想的な方法は、を使用することBindingです。
各テキストボックスは既にバインドされていますが、バインドされたデータを取得する方法がわかりません。

FIRST DataType (ProductModel) のバインドされたテキスト ボックスの例を次に示します。
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ProductId}" Margin="5" Width="150" />

ProductIdProductNameおよびのプロパティごとに 1 つありますUnitPrice

重要: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. 私が覚えている限り、テキストボックスのデフォルトのバインドモードは TwoWay です。しかし、この場合、ProductId/Name + UnitPrice は依存関係のプロパティではないため、テキスト ボックス内のテキストが変更されたときに、バインドされた値が更新されない/返されないのは正しいでしょうか? (イベントは付いていないので…)

  3. プロジェクトでデータ コンテキストが構成されたことはありませんが、XAML ページのすべての "バインディング タグ" にソースが定義されていないようです。ソースが実際にDataTypeDataTemplate、バインドされたオブジェクトを含む である可能性はありますか?

  4. 2 番目の DataTemplate (ProductViewModel のもの) には、次の ContentControl タグがあります<ContentControl Margin="10" Content="{Binding Path=CurrentProduct}" />
    その目的は何ですか?

  5. TwoWay バインディングが発生した/発生した場合、関数内から値を取得するにはどうすればよいSaveProduct()ですか? CurrentProduct.ProductName変更された名前を取得するために参照するだけですか?

時間を割いて回答してくださった皆様、本当にありがとうございました。

4

1 に答える 1

1

バインディングが次のように使用されるとはどういう意味ですか:{Binding ProductId}?

このバインディングを設定している特定のコントロールプロパティはProductId、オブジェクトセットのプロパティをとして検索し、DataContextそれに応じてコントロールのプロパティ値を設定します。

私が覚えている限り、テキストボックスのデフォルトのバインディングモードはTwoWayです。しかし、この場合、ProductId / Name + UnitPriceは依存関係のプロパティではないため、テキストボックス内のテキストが変更されたときにバインドされた値が更新/返送されないのは正しいですか?(それに付随するイベントがないので...)

バインドを行うDependencyPropertyために、オブジェクト内のプロパティを作成する必要はありません。TwoWay

プロジェクトでデータコンテキストが構成されたことはありませんが、XAMLページのすべての「バインディングタグ」にソースが定義されていないようです。ソースが実際にはバインドされたオブジェクトを含むDataTemplateのDataTypeである可能性がありますか?

XAML内で設定されているバインディングは、内に格納されているオブジェクトを使用するため、ビューDataContextのを明示的に設定しない場合はDataContextnullになります。DataContextただし、はその親から継承されていることに注意してください。実際に、などを使用してコンテンツを設定している場合はCurrentProduct、タイプごとにすべてのプロパティをバインドできますProduct

2番目のDataTemplate(ProductViewModel 1)には、次のContentControlタグがあります。

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

それは何の目的ですか?

それはあなたのコンテナとして機能しており、CurrentProduct1つだけのアイテムを含めることができます。

TwoWayバインディングが発生した/発生した場合、SaveProduct()関数内から値を取得するにはどうすればよいですか?変更された名前を取得するには、CurrentProduct.ProductNameと言うだけですか?

アプリケーション全体を見なくても、ContentControlはに設定されているCurrentProductと思います。あなたTextBoxなどはすべて、などのそれぞれのプロパティにバインドされています。CurrentProduct.ProductId保存したい製品は実際にはCurrentProductです。ViewModel内でsaveを呼び出すと、にアクセスしCurrentProductて必要に応じて永続化するだけCurrentProduct.PropertyNameで、UIから伝播された変更が含まれます。

于 2013-01-01T21:10:16.240 に答える