2012-01-19 3 views
0

Я использую MVVM, из того, что я знаю, для данных является вид < => ViewModel < => Модель.Как мне узнать, как открыть окно «Открыть»?

ViewModel может взаимодействовать с View с использованием двусторонней привязки.

Но теперь у меня есть LoginView (который находится в окне), если успешный вход в систему будет проверяться в ViewModel.

Когда он не работает, он должен сообщить о закрытии окна. Но как? ViewModel не должен знать о представлении ....

+0

Пожелтеть событие и позволить ему ответить на него? – vcsjones

+0

Возможный дубликат [здесь] (http://stackoverflow.com/questions/501886/wpf-mvvm-newbie-how-should-the-viewmodel-close-the-form). – docmanhattan

+0

Мы, как правило, нарушаем обычные правила MVVM, наш WindowViewModel знает о его окне, иначе было бы очень сложно обрабатывать окна правильно. После этого мы никогда не касаемся View из ViewModels, и он отлично работает. – dowhilefor

ответ

7

Ваша ViewModel - это представление вашего состояния пользовательского интерфейса. Вы могли бы просто создать boolean-свойство , тогда ваше представление может иметь код (да, я сказал, он может иметь код!), Который показывает/скрывает окна на основе состояния этого свойства.

Я думаю, что люди слишком много подчеркивают MVVM. Пока ваш ViewModel может выполняться без представления, чтобы облегчить тестирование, вы делаете MVVM правильно. Нет ничего плохого в том, чтобы иметь код для поддержки вашего представления.

+0

+1 Что-то я всегда задавался вопросом: Откуда люди поняли, что в MVVM абсолютно нет кода в представлении ?! Это похоже на использование goto для некоторых людей, чтобы сказать им написать код в представлении. До тех пор, пока это не касается бизнеса, его imho отлично действует и является лучшим решением для расширения и добавления кода в представление, путем подкласса или прикрепленного поведения. – dowhilefor

+0

@ dowhilefor Я понятия не имею, почему люди так думают! есть некоторые аргументы, если вы используете данные Blend и design-time. Однако, сколько людей используют Blend для своих приложений WPF? – ColinE

+0

@ dowhilefor Я всегда был затронут примером, который я прочитал, они продолжают показывать, как они могут сделать вид без каких-либо кодов и работать префект. Иногда я задаюсь вопросом, прекрасно ли это, если я просто взломаю и нарушу правила MVVM? Но тогда я всегда думаю, что пример, который люди пишут, должен быть лучшим решением, чем я делаю lol –

0

Я бы сказал здесь просто и воспользуюсь случаем, чтобы уведомить его, что он должен закрыть.

ViewModel:

public event EventHandler LoginFailed; 

public void Login() 
{ 
    if (fail) 
    { 
     if (this.LoginFailed != null) 
     { 
      this.LoginFailed(this, EventArgs.Empty); 
     } 
    } 
} 

Вид:

((MyViewModel)this.DataContext).LoginFailed += (sender, e) => 
    { 
     // Code to close the window, such as window.Close(); 
    }; 
0

Вы должны добавить определенное событие в ViewModel (что-то вроде LoginFailed). Затем вы должны связать это событие с командой, которая закрывает окно. См. this сообщение в блоге о том, как связать эти два.

0

Вот еще один вариант. Вместо использования мероприятия вы могли бы использовать делегат:

public class View { 
    ... 
    myViewModel.OnFail =() => {this.Close();}; 
    ... 
} 

public class MyViewModel { 
    public Action OnFail {get; set;} 

    private void Login() { 
     .... 
     if (failed && OnFail != null) 
      OnFail(); 
    } 
} 
Смежные вопросы