Текстовое поле привязки данных - PullRequest
3 голосов
/ 21 февраля 2011

Ну, я новичок в MVVM, поэтому, пожалуйста, любые советы и предложения приветствуются:)

Я хочу отслеживать имя пользователя и пароль, и пользователь может установить это в представлении настроек. В SettingsViewModel у меня есть 2 свойства для этих 2 полей, которые связаны с текстовыми полями в представлении. Я добавил кнопку «Сохранить» на панель приложения, и через RelayCommand он выполняет метод в ViewModel, когда пользователь щелкает ее.

Что не так:

  • Когда пользователь вводит текстовое поле и не выходит из него, но нажимает кнопку сохранения напрямую, значение еще не имеет данных. Итак, как вы решаете это? Является ли единственный способ использовать функцию coding4fun: TextBoxBinding.UpdateSourceOnChange = "True" из библиотеки coding4fun?

  • Когда пользователь вводит данные в текстовое поле и оно привязано к данным, при выходе из страницы настроек и возвращении к ней эти данные сохраняются. Как убрать это, если пользователь не нажал кнопку сохранения? Довольно странно, что вы сохраняете данные на странице, когда они еще не были сохранены ... Но поскольку я использую MVVMLight, страница статически создается в ViewModelLocator и остается активной, пока программа работает.

Ну, как я уже сказал, любые советы, советы, предложения приветствуются:)

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Re 1: Это известная проблема , где, если последний элемент управления, на котором был фокус, был текстовым полем, и вы нажимаете кнопку на панели приложения, его последнее значение не привязано к данным.В моей обработчике щелчков на панели приложений я вызываю следующий метод для принудительной привязки данных, если последний элемент управления, на котором был фокус, был текстовым полем или паролем.

private static void UpdateBoundText()
{
    var focusObj = FocusManager.GetFocusedElement();
    if (focusObj == null) return;
    var binding = focusObj is TextBox ? ((TextBox)focusObj).GetBindingExpression(TextBox.TextProperty)
                : focusObj is PasswordBox ? ((PasswordBox)focusObj).GetBindingExpression(PasswordBox.PasswordProperty) 
                : null;
    if (binding != null)
    {
        binding.UpdateSource();
    }
}
3 голосов
/ 21 февраля 2011

1 - Установите значение UpdateSourceTrigger для привязки TextBox на PropertyChanged

<TextBox Text="{Binding MyProperty, UpdateSourceTrigger=PropertyChanged}" />

2 - я не использовал MVVM Light Toolkit, но, вероятно, он имеетконцепция активируемой модели представления, при которой вы можете сбросить свойства к значениям по умолчанию в вашей модели представления.Если это не так, взгляните на Caliburn.Micro , который поддерживает эту концепцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...