0

コードファースト技術を使用してエンティティをDBに永続化しようとすると問題が発生します。私がやっていることの例は、次のとおりです。MSDN Sampleアプリは、通常、1つのケースを除いて意図したとおりに動作します。SIPはEFがWP7でオブジェクトの変更を自動検出するのを防ぎます

私は既存のエンティティを持っており、TitleフィールドとAppBarアイコンを保存するTextBoxを持つページにバインドします(上記のリンクの「New Task」スクリーンショットに似ていますが、 2方向バインディングで既存のエンティティで満たされている場合)、次の問題が発生します。 TextBoxを選択してタイトルを変更して保存ボタンを押すと、メモリ内のエンティティが更新され、完全なリストに新しいタイトルが表示されるようになります。しかし、新しいタイトルはDBに保持されません(変更を自動検出しません)。これは奇妙なことです。メモリ内のオブジェクトが変更されただけでなく、TextBoxの選択を解除してからsaveを押すと、変更がDBに保持されるためです。

私はいくつかの変更の検出に関する問題を抱えているので、他にもthis.Focus()を追加するか、保存メソッドの始めに他の要素に焦点を当てることをお勧めします。私の場合、これは助けにならない。私がTextBoxの選択を解除し、キーボードを隠す(またはthis.Focus()を行うためにバインドしたキーボードのReturnキーを押す)ために画面をタップしない限り、オブジェクトは変更されたとして検出されません。

どうすればこの問題に対処できますか?キーボードがまだ見えるときにEFがオブジェクトの変化を検出するのを止めているのは何ですか?

答えて

1

あなたが説明した内容に正確に従っているかどうかわかりませんが、テキストボックスにバインドしたプロパティはTextChangedがテキストボックスで発生するまで更新されません。テキストボックス、基本的には、他の場所をタップするとフォーカスが失われます。

これとその動作の簡単な回避策があります。小さな動作をすることで、各キーストロークのバインディングをテキストボックスに強制的に更新させることができます。入力中にすべてが更新され、キーボードはまだそこにあります。

行動:

/// <summary> 
/// Update property on every keystroke in a textbox 
/// </summary> 
public class UpdateTextSourceTriggerBehavior : Behavior<TextBox> 
{ 
    protected override void OnAttached() 
    { 
     this.AssociatedObject.TextChanged += OnTextBoxTextChanged; 
    } 

    void OnTextBoxTextChanged(object sender, TextChangedEventArgs e) 
    { 
     var bindingExpression = AssociatedObject.ReadLocalValue(TextBox.TextProperty) as BindingExpression; 
     if (bindingExpression != null) 
     { 
      bindingExpression.UpdateSource(); 
     } 
    } 

    protected override void OnDetaching() 
    { 
     this.AssociatedObject.TextChanged -= OnTextBoxTextChanged; 
    } 
} 

は今、ちょうどこのようなあなたのテキストボックスに、この動作を添付:あなたがタップしたときにそのよう

<TextBox Text="{Binding YourPropertyName, Mode=TwoWay}"> 
       <i:Interaction.Behaviors> 
        <UpdateTextSourceTriggerBehavior/> 
       </i:Interaction.Behaviors> 
      </TextBox> 

これは、すべての時間を更新し、あなたのviewmodelに財産を維持しますテキストボックスに入力した直後に保存すると、正しい値が保存されます。それが役に立てば幸い!

乾杯、 アンダース

+0

@Alex Kはあなたの問題を解決することができましたか? –

+0

申し訳ありませんが、私はちょうど最後の数日が眠っていました。あなたのソリューションは私のためにそれを修正しました。ありがとうございました。 –

関連する問題