0

データバインディングに関する次の 4 点がわかりません。予期しない結果 (コード ビハインドの古いデータ) が得られたのか、それとも私が物事の仕組みを誤解した結果なのかはわかりません。

  1. テキストボックスを離れると、テキストボックスにバインドされたデータが更新されます。正確にこれを行うイベントは何ですか? 焦点を失った?
  2. コードビハインドで現在変更されているデータを使用すると、古いデータがまだ使用されているようです。なぜこうなった?ポイント3が理由でしょうか?
  3. テキストボックスの更新後、テストを行い、datacontext を何も設定せず、datacontext を同じソースに再送信しました。表示されている値は、編集前の値です。編集後に表示されたのに、再バインド後に古い値に戻ったのはなぜですか?
  4. 値を 2 回目に変更した後、コード ビハインドが最初の変更後にデータを使用しているようです。ポイント 3 のように再バインドすると、同じ結果になります (最初の変更後の値、2 番目の変更は無視されます)。コード ビハインドは常に 1 アップデート ビハインドのようですが、これを変更できますか?

なぜこれが起こるのか説明できる人はいますか?

望ましい動作:

住宅数を編集すると人数も更新されるようにしたい。その場で望ましいですが、フォーカスを失った後は問題ありません。フォーカスを失った場合、isle ID 0 の値は古い値ではなく、正しい値である必要があります。

理解を容易にするために、3 つの画面と関連するコード サンプルを含む図を示します。

http://www.mathematik-lehramtsstudium.de/BindingExample.jpg

私のクラス:

//class for isles
public class isle : INotifyPropertyChanged
{        
    //Dummyvariables,...
    private int _intBauer;
    private int _intBauerBev;        

    //variables
    public int intIsleID { set; get; }      //isle ID
    public string strName { set; get; }     //isle name

    public int intBauer                     //housing count
    {       
      set 
      { 
         this._intBauer = value; 
         NotifyPropertyChanged("intBauer"); NotifyPropertyChanged("intBauerBev"); 
      } 
      get 
      { 
         return _intBauer; 
      } 
    }       
    public int intBauerBev                  //each house hosts 8 people
    { 
        set { this._intBauerBev = value;} 
        get { return intBauer * 8; } 
    }       

    protected void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

}

LostFocus - ページの右側を更新するためのイベント

    private void textboxHäuser_LostFocus(object sender, RoutedEventArgs e)
    {           
        //Gesamtzahl neu berechnen
        listIsles[0].intBauer = 0;
        for (int i = 1; i < 10; i++)
        {
            listIsles[0].intBauer += listIsles[i].intBauer;
        }
        //hard refresh DataContext, since it does not seem to update itself
        //leaving these two lines out of my code changes nothing tho, as expected 
        gridInfoGesamt.DataContext = "";
        gridInfoGesamt.DataContext = listIsles[0];
    }
4

1 に答える 1

0

私が直面していた問題は、この場合にイベントが発生する順序です。より正確に言えば、2 つのことが同時に起こっているということです。

TextBox は、他の TextBox コントロールを更新するために使用したイベントと同じように、「LostFocus」イベントを使用してプロパティを更新します。両方が一度に起動したため、計算に「古い」データを使用したため、UI が片側で一歩遅れているように見えました。

これを修正するには、XAML で次のようにバインドして、TextBox がプロパティを更新する方法を変更する必要がありました。

Text="{Binding intBauer, UpdateSourceTrigger=PropertyChanged}"

"LostFocus" の前、さらには "TextChanged" の前に、プロパティが即座に更新されるようになりました。これにより、終了後だけでなく、ユーザーが値を変更したときに UI を更新する可能性も開かれます。はるかにきれいで見栄えが良くなります。

于 2013-11-15T00:47:55.013 に答える