как я могу установить содержимое xaml в viewmodel - PullRequest
0 голосов
/ 21 марта 2012

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

    private void OkButtonClick(object sender, RoutedEventArgs e)
    {
        LoginOperation loginOp = FLS.Utilities.RIAWebContext.Current.Authentication.Login(
            new LoginParameters(usernameTextBox.Text, passwordTextBox.Text));
        loginOp.Completed += (s2, e2) =>
        {
            if (loginOp.HasError)
            {
                errorTextBlock.Text = loginOp.Error.Message;
                loginOp.MarkErrorAsHandled();
                return;
            }
            else if (!loginOp.LoginSuccess)
            {
                errorTextBlock.Text = "Login failed.";
                return;
            }
            else
            {
                errorTextBlock.Text = string.Empty;
                Content = new WelcomeView();

            }
        };
    }

Теперь я переместил код для MVVMв модели представления и используйте делегатКоманду на кнопке гиперссылки.

<UserControl ... >
<Grid ... >
...
<HyperlinkButton Content="Login" Height="23" HorizontalAlignment="Left" Margin="313,265,0,0" Name="loginButton" Command="{Binding Path=LoginCommand}" VerticalAlignment="Top" Width="75"/>
...
</Grid>
</UserControl>

Но я не знаю, как я делаю Content = new WelcomeView ();из кода в модели представления?

1 Ответ

0 голосов
/ 22 марта 2012

Хорошим шаблоном дизайна будет иметь два разных шаблона данных: один для представления данных перед входом в систему и второй шаблон данных для использования после входа в систему.

Есть несколько способов достичь этого. Тот, который я обычно использую, просто помещает ViewModel (непосредственно с использованием привязки) в единственные дочерние элементы Window.

В вашей ViewModel реализуйте класс селектора контента. Это класс, производный от DataTemplateSelector и использующий API FindResource для получения соответствующего шаблона данных.

<Window ...>
    <Window.Resources>
        <DataTemplate x:key="beforeLogin">
            ...
        </DataTemplate>
        <DataTemplate x:Key="afterLogin">
            ...
        </DataTemplate>            
    </Window.Resources>

    <Window.ContentTemplateSelector>
        <code:MyTemplateSelector />
    </Window.ContentTemplateSelector>

    <-- Here is the content of Window. It's the view model (data). The View will be
        bind by the TemplateSelector
    <code:YourViewModel />

</Window>

Проверьте эту страницу: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplateselector.aspx для соответствующего примера.

Существуют другие схемы проектирования. Еще одна распространенная идиома - это просто запуск события «UiRequest», которое будет подхвачено выделенным кодом представления. Помните, что MVVM требует, чтобы ViewModel был «независимым от вида», но на самом деле это не означает «нет кода позади». Это означает, что виртуальная машина не может ссылаться на что-либо в представлении. Связь таким образом происходит при просмотре событий (например, привязка данных - это просто оболочка вокруг событий, измененных свойством). Поэтому имейте событие UiRequest в вашей модели представления и разработайте протокол. В конструкторе View - зарегистрируйте обработчик. В обработчике измените содержимое (люди используют эту идиому в основном для запуска всплывающего окна, но его можно использовать где угодно).

...