0

코드 우선 기술을 사용하여 엔티티를 DB에 유지하려고 할 때 문제가 있습니다. 내가하는 일을 예로 들면 다음과 같은 내용을 볼 수 있습니다. MSDN Sample. 앱은 일반적으로 한 가지 경우를 제외하고는 의도 한대로 작동합니다.SIP는 EF가 WP7에서 개체 변경을 자동 감지하지 못하도록합니다.

기존 엔티티가 있고이를 Title 필드와 저장할 AppBar 아이콘이있는 TextBox (위의 링크의 '새 작업'스크린 샷과 비슷하지만 값 pre - 양방향 바인딩이있는 기존 엔터티로 채워짐) 다음과 같은 문제가 발생합니다. TextBox를 선택하고 제목을 변경하고 저장 버튼을 누르면 전체 목록에 새 제목이 표시되도록 메모리 내의 항목을 업데이트합니다. 그러나 새 제목은 DB에 유지되지 않습니다 (변경 사항을 자동 감지하지는 않습니다). 이것은 이상한 현상입니다. 메모리 내의 객체가 변경 되었기 때문 만이 아니라 TextBox의 선택을 취소 한 다음 저장을 클릭하면 변경 사항이 DB에 유지되기 때문입니다.

일부 변경 감지 문제로 인해 다른 질문이 표시되었지만 this.Focus()을 추가하거나 저장 방법의 시작 부분에 다른 요소를 중점적으로 제안합니다. 이건 내 경우에는 도움이 안돼. TextBox의 선택을 취소하고 키보드를 숨기거나 (this.Focus()) 할 바인딩 된 키보드의 Return 키를 누르는 화면을 탭하지 않으면 변경된대로 객체를 감지하지 못합니다.

어떻게 해결할 수 있습니까? 키보드가 여전히 보이면 EF가 객체 변경을 감지하는 것을 정확히 멈추고 있습니까?

답변

1

내가 정확히 무엇을 설명했는지 확신 할 수 없지만 TextChanged가 텍스트 상자에서 실행될 때까지 텍스트 상자를 바인딩 한 속성이 업데이트되지 않는다고 생각합니다. Textbox, 기본적으로 포커스를 잃을 것입니다.

이 동작과 동작에 대한 간단한 해결 방법이 있습니다. 작은 동작을하면 텍스트 상자에 각 키 입력에 대한 바인딩을 업데이트 할 수 있으므로 입력하는 동안 모든 것이 업데이트되고 키보드는 여전히 있습니다.

동작 :

/// <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; 
    } 
} 

지금은 그냥 같이 당신의 텍스트 상자에이 동작을 첨부 : 당신이 누를 때 있도록이 업데이트 당신의 ViewModel에 모든 시간을 속성을 유지합니다

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

텍스트 상자에 입력 한 후 바로 저장하면 올바른 값이 저장됩니다. 희망이 도움이됩니다!

건배,

+0

@ 알렉스 K 앤더스가 문제를 해결하기 위해 당신이 할 수 있었다? –

+0

죄송합니다. 지난 며칠 동안 방금 습격당했습니다. 귀하의 솔루션은 그것을 해결했습니다. 고맙습니다. –

관련 문제