0

さて、私がまっすぐに考えているかどうか見てみましょう:

ソースからデータを読み取って、それをコントロールに適用したい場合は、データ バインディングの問題を解決するよりも、直接それを実行した方がよいでしょう。IOW、私はこれを行うこともできます:

foreach (var quad in listQH)
{
   ...
   tb.Text = quad.Ph1;

...とは対照的に:

tb.DataBindings.Add(new Binding("Text", quad, "Ph1"));

ただし、基になるクラス インスタンス内の更新でコントロール (この場合は "tb" textBox) を更新し、ユーザーによるコントロールの更新でこれらのクラス インスタンス メンバーを更新する ("双方向バインディング") 場合は、次のようにする必要があります。 INotifyPropertyChanged を実装します。しかし、次のコードを変更する必要があります。

List<QHQuad> listQH = GetForPlatypus(PlatypusId, dow); // listQH locally declared
foreach (var quad in listQH)
{
    int QHCell = quad.QH;
    if ((QHCell >= 1) || (QHCell <= QUARTER_HOUR_COUNT))
    {
        string PH1CellToPopulate = string.Format("textBoxA_{0}", QHCell);
        string PH2CellToPopulate = string.Format("textBoxB_{0}", QHCell);
        string PH3CellToPopulate = string.Format("textBoxC_{0}", QHCell);
        var tb = (TextBox)this.Contro.Find(PH1CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph1"));
        . . .

...に:

List<QHQuad> listQH; //global to the form
. . .
listQH = GetInfoForPlatypus(PlatypusId, dow);
foreach (var quad in listQH)
{
    // the same as above

そして、最終的には、これらの潜在的に変更されたクラス インスタンス値を次の方法で保存できます。

foreach (var quad in listQH)
{
    UpdateQH(quad); // quad contains members QH, Ph1, Ph2, and Ph3 ("UPDATE BLA SET PH1 = :Ph1, PH2 = :Ph2, PH3 = :Ph3 WHERE QH = :QH")
}
4

1 に答える 1

2

あなたは正しい考えを持っています。ただし、ここにいくつかの指針があります。

INotifyPropertyChangedは、ViewModel内からの変更をビューにバブルアップする場合にのみ必要です。双方向バインディングには必要ありません。双方向バインディングが必要で、ビューがロードされたときに1回だけ読み取る必要がある場合は、プレーンプロパティで問題ありません。

MVVM(モデル-ビュー-ビューモデル)パターンを確認することをお勧めします。これは、データバインディングの重い実装に最適であるため、WPF、Silverlight、Metroなどに推奨されるデザインパターンです。

于 2012-08-21T02:08:06.303 に答える