Свойство в ViewModel не отображается в View - PullRequest
2 голосов
/ 14 июня 2011

У меня есть ViewModel под названием MainWindowViewModel.В этом у меня есть свойство, которое показывает модальное окно при возникновении ошибки.Это работает нормально, если во время запуска возникает ошибка.

Когда ошибка возникает после запуска, в SubViewModel я вызываю параметризованный конструктор в MainWindowViewModel.

MainWindowViewModel.cs

public MainWindowViewModel()
{
    if (!isServerRunning)
    {
        this.ModalWindow = new LogViewModel("Server is down.");
    }
    else
    {
        this.ModalWindow = new LogViewModel();
    }
}


public MainWindowViewModel(string logMessage)
{
    this.ModalWindow = new LogViewModel(logMessage);
}


public LogViewModel ModalWindow
{
    get
    {
        return _modalWindow;
    }
    set
    {
        _modalWindow = value;

        OnPropertyChanged("ModalWindow");
     }
}

MainWindow.xaml

....

<Grid>
    <vw:LogView Content="{Binding Path=ModalWindow}"/>
</Grid>
  • MainWindowViewModel isпривязан к MainWindow.xaml

  • SubViewModel привязан к SubView.xaml

  • MainWindow.xaml загружает несколько представлений, одним из которых является SubView.

В App.xaml Я создал экземпляр ViewModel и привязал его к MainWindow.

protected override void OnStartup(StartupEventArgs e)
{                                  
    base.OnStartup(e);
    MainWindow mainWindow = new MainWindow();
    MainWindowViewModel viewModel = new MainWindowViewModel();
    mainWindow.DataContext = viewModel;
    mainWindow.Show();
}

Я понял, чтомодальное окно появляется, когда после запуска возникает ошибка, если я создаю свойство модального окна в SubViewModel и связываю его с SubView.Но это не нормально, так как SubView - это всего лишь DockPanel, покрывающий 1/4 MainWindow.Т.е. 1/4 покрыта только модальным окном вместо всего MainWindow.

Я не уверен, почему модальное окно не появляется в MainWindow, когда я вызываю параметризованный конструктор из SubViewModel.Когда я отлаживаю, я вижу, что часть _modalWindow = value; имеет правильные значения, но в любом случае модальное окно не появляется.

Я связываю ViewModel с Datacontext MainWindow.Вероятно, поэтому я вижу модальное окно, когда при запуске возникает ошибка.Для ошибок после запуска: Должен ли я (из SubViewModel, где я вызываю параметризованный конструктор в MainWindowViewModel) снова выполнить какую-то привязку к текстовому тексту Mainwindow?Как лучше всего это сделать, не создавая новый экземпляр MainWindow?Потому что MainWindow следует создавать только один раз.

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

Вы не должны создавать MainWindowViewModel снова и снова. Он должен быть создан один раз и установлен как текстовый текст главного окна.

Проблема в подходе, который вы используете для отображения диалоговых окон. Это усложняет ситуацию.

Лучшее решение для отображения диалоговых окон - использовать мессенджер набора инструментов mvvmlight. Проверьте this на некоторые советы по его использованию.

Вот как вы можете использовать мессенджер mvvmlight toolkit для отображения диалоговых окон:

Вид:

Messenger.Default.Register<DialogMessage>(
         view,
         msg =>
         {
             var result = MessageBox.Show(
                 msg.Content,
                 msg.Caption,
                 msg.Button,
                 msg.Icon);
         }
);

ViewModel:

private void ShowMessageBox(string msgStr, string capStr, MessageBoxButton btn, MessageBoxImage img)
{
        var message = new DialogMessage(msgStr, null)
        {
            Button = btn,
            Caption = capStr,
            Icon = img
        };

        Messenger.Default.Send(message);
}

Просто вызовите вышеуказанный метод (ShowMessageBox) из любой модели представления, чтобы отобразить диалоговое окно.

0 голосов
/ 14 июня 2011

Похоже, вы воссоздаете ViewModel каждый раз, когда происходит ошибка. Если это так, вам также необходимо сбросить привязку в представлении, что противоречит цели MVVM. Лучше иметь один экземпляр ViewModel и распространять ошибки в View с помощью OnPropertyChanged ().

Конечно, есть много способов сделать это, но я обычно сохраняю ссылку на ViewModel в моем View, а затем ссылку на Model в ViewModel. Таким образом, модель полностью отделена от View / ViewModel и аналогично ViewModel отделена от View.

...