0

У меня проблема с попыткой сохранить объекты в БД с использованием метода кода. Например, что я делаю, вы можете посмотреть следующие MSDN Sample. Приложение обычно работает по назначению, за исключением одного случая.SIP предотвращает автоматическое обнаружение объекта EF на WP7

Если у меня есть существующая сущность, и я привязываю ее к странице с TextBox, чтобы удерживать поле Title и значок AppBar для сохранения (аналогично экрану «Новая задача» в приведенной выше ссылке, но со значениями pre заполненный существующим объектом с двусторонней привязкой), возникает следующая проблема. Если у меня выбран TextBox, и я изменяю заголовок и нажимаю кнопку «Сохранить», он обновляет сущность в памяти, так что полный список теперь отображает новый заголовок. Но новый заголовок не сохраняется в БД (он не автоматически обнаруживает изменения). Это странно, не только потому, что объект в памяти изменился, но также и потому, что если я отменим выделение TextBox, а затем нажмите «Сохранить», он сохранит изменения в БД.

Я видел другие вопросы о SO с некоторыми проблемами с обнаружением изменений, они предлагают добавить this.Focus() или сосредоточить некоторый другой элемент в начале метода сохранения. Это не помогает в моем случае. Если я не коснусь экрана, чтобы отменить выделение TextBox и скрыть клавиатуру (или нажмите клавишу «Return» на клавиатуре, на которую я обязан это сделать. Focus()), он не будет обнаруживать объект как измененный.

Как я могу обратиться к этому вопросу? Что именно останавливает EF от обнаружения изменения объекта, когда клавиатура все еще видна?

ответ

1

Не уверен, что я точно следую тому, что вы описали, но я думаю, что проблема заключается в том, что свойство, связанное с вашим текстовым полем, не обновляется до тех пор, пока TextChanged не будет запущен в текстовое поле, и это будет сделано, когда вы покинете Текстовое поле, в основном это потеряет Focus, если вы нажмете куда-нибудь еще.

Существует простое обходное решение для этого и его поведения. Сделав небольшое поведение, вы можете заставить текстовое поле обновлять привязку при каждом нажатии клавиши - так что все обновляется во время ввода, а клавиатура все еще там.

Поведение:

/// <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 К вам удалось решить проблему? –

+0

Извините, за последние несколько дней меня просто замяли. ваше решение исправило это для меня. Спасибо. –

Смежные вопросы