0

Здраствуйте. Столкнулся с такой проблемой. Я сделал placeholder для текстбокса, но его реализацию прописал через ивенты. Но суть задания заключаеться в том, что нужно использовать MVVM.

    private void textBox_Login_GotFocus(object sender, RoutedEventArgs e)
    {
        if (textBox_Login.Text == "Логин") textBox_Login.Text = "";
    }
private void textBox_Login_LostFocus(object sender, RoutedEventArgs e)
{
    if (textBox_Login.Text == "") textBox_Login.Text = "Логин";
}

Как мне эти два ивента перенести в MVVM?

  • 1
    Стили, а точнее - триггеры. – EvgeniyZ Dec 01 '20 at 23:08
  • может тут что полезное есть Watermark / hint text / placeholder TextBox – tym32167 Dec 01 '20 at 23:24
  • 1
    У нас тоже есть ответ на эту тему, может как дубликат тогда? – EvgeniyZ Dec 01 '20 at 23:30
  • @EvgeniyZ какой дубликат. Вы кинули как это можно сделать через триггеры, но я просил с использованием MVVM, это две разные вещи... – Pineapple Haze Dec 03 '20 at 14:56
  • С чего вдруг разные? Что такое MVVM? Это отделение ui от кода, то есть все делится на 3 слоя (m - данные, то, что вы получаете из вне. v - то, что видит пользователь и взаимодействие с ним. ну и vm - то, что связывает эти два слоя, делая свойства для привязки, команды и так далее). В MVVM подходе вы не должны как либо взаимодействовать с ui, там не может быть эвентов, нет button.Click и нет прямого обращения textBox1.Text ="...". Так почему вдруг это две разные вещи? Вот удалите все в xaml, запустится проект? Если нет, то у вас и нету MVVM. – EvgeniyZ Dec 03 '20 at 15:06
  • View слой (ui) - все стили, события и прочее, должно быть в xaml, если такого невозможно, то делаются расширения (behaviours), в вашем случае, не нарушая правила mvvm, достаточно триггеров и xaml кода. – EvgeniyZ Dec 03 '20 at 15:09
  • @EvgeniyZ слова правильные, но в моем случае пустые, вы очень невнимательный и не слышите чего мне нужно, не знаете - так не пишите то что итак понятно, задача было конкретно поставлена) Решение я уже нашел. Есть ивент триггеры, в нем есть Command, прописываете туда команду, которую ранее создали в ViewModel, кроме того textBox биндите к проперти, которую будете менять, когда команда будет выполняться. В set этой проперти пишите RaisePropertyChanged и вуаля, вот вам и "обработчик на евент" через паттерн MVVM – Pineapple Haze Dec 03 '20 at 15:19
  • Посмотрите внимательней на свой вопрос, встаньте на наше место, забудьте вот полностью свой проект и читайте лишь свой вопрос, что видите? Я сделал placeholder для текстбокса, но его реализацию прописал через ивенты. Но суть задания заключаеться в том, что нужно использовать MVVM. - если перефразировать, то "Как сделать placeholder, не нарушая MVVM паттерн?", я вам скинул как, для этого достаточно лишь XAML!, без каких либо привязок, эвентов и прочего, чистый XAML. Ну так чего вы тогда от нас еще ожидаете? Повторюсь, вам тут не нужны события и привязки, сейчас вы сделали костыль. – EvgeniyZ Dec 03 '20 at 15:26
  • Могу тут предположить, что вам надо этот текст плейсхолдера менять динамически, но так и в данном случае вы не сказали про это что либо в вопросе, да и делается это тоже по другому, а не так, как вы расписали выше. В любом случае, дубликатом отмечал не я, я лишь предложил, сообщество согласилось (как и я), ваше право переоткрыть вопрос (кнопка под ним). – EvgeniyZ Dec 03 '20 at 15:28
  • @EvgeniyZ Это просто смешно, вы перефразировали так, как Вам это удобно. Я задал конкретный вопрос, который вы себе перефразировали... Суть задания как раз таки и заключалась в том, чтобы сделать такой костыль. – Pineapple Haze Dec 03 '20 at 15:29
  • Тем более не все варианты событий можно проработать через XAML, а вдруг нужно будет выполнить большой код, в котором будут и классы и так далее. Тоже будете через XAML прописывать?) – Pineapple Haze Dec 03 '20 at 15:32
  • Если этот код отвечает за UI, то да, его место исключительно в View слое, иначе, это будет нарушением MVVM подхода. К тому же, в View слое не может быть тяжелой логике, ибо этот слой создан лишь для отображения и взаимодействия с пользователем. Если вдруг у вас там серьезная логика, которая допустим читает большой файл, взятый из интернета и на его основе генерирует UI, то у вас нарушение MVVM. А вопрос... Как я написал выше, поставьте себя на наше место. Вы пришли просить помощи у людей, которые помогают решить вопросы, направить в нужное русло, а не писать костыли. – EvgeniyZ Dec 03 '20 at 15:34
  • @EvgeniyZ И на этом спасибо. Буду знать, что в следующий раз нужно намного точнее конкретизировать поставленный вопрос. – Pineapple Haze Dec 03 '20 at 15:38
  • Помните, что SO - это база "Вопрос-ответ", где вопрос должен быть полезен не только вам, но и будущему читателю. Будет-ли полезно для него знание о том, как сделать "костыль"? Я сомневаюсь. В данном случае мы проголосовали за закрытие вопроса в связи с тем, что на SO уже есть грамотное решение поставленной задачи. А ваши "наработки", ну тут уж извините, задавайте тогда вопрос иначе, не затрагивая placeholder, спрашивайте тогда "Как отловить событие с использованием MVVM?", и то, в этом случае это будет дубликат. – EvgeniyZ Dec 03 '20 at 15:43
  • @EvgeniyZ ну вот, я таким же способом реализовал свой плейсхолдер, как и вы кинули. Получаеться вы в той теме дали ответ "костыль"? Это не костыль, а лишь еще один способ, как в CB можно реализовать плейсходер используя MVVM. Если "костыль" заключаеться в том, что плейсхолдер можно реализовать триггерами ,а я хотел это сделать в CB, тогда тут все понятно – Pineapple Haze Dec 03 '20 at 15:50
  • Вы читаете мои комментарии? Если вам надо изменить свойства контрола по событию самого контрола, то это задача исключительно view слоя и размазывание ее обязанностей по другим слоям да, костыль. Плейсхолдер, который должен лишь убрать ранее отображаемый текст является как раз view, а если ещё точнее, то элементом стиля. Если вам по событию в ui нужно начать выполнять ряд действий, которые не относятся к ui, тогда вариант выше это стандартное решение задачи. Как пример, надо при наведении мыши на имя, подгрузить из базы полные данные человека, да, берём код выше и обрабатываем. – EvgeniyZ Dec 03 '20 at 15:59
  • Но если в этом примере будет плейсхолдер, то он будет отдельн от этой логики, он будет в стилях и основан на триггерах. И view слой будет отделен. – EvgeniyZ Dec 03 '20 at 16:01
  • А да, вы ещё не забывайте про такую вещь, как ООП и solid, где первая буква за что отвечает? Верно, "единственная ответственность", то есть класс Person не может быть ответственным за запись данных в базу. Также и тут, vm и m слой не должены быть ответственными за работу плейсхолдера, ибо это задача view и стилей, которые в свою очередь могут подстроится под vm слой, но не наоборот. В любом случае, mvvm это набор рекомендаций, а как вы у себя подобное реализуете, это уже дело ваше. Так что я надеюсь смог объяснить почему это "костыль"... – EvgeniyZ Dec 03 '20 at 16:27

0 Answers0