Простой MVVM - Ищем пример страницы регистрации пользователя - PullRequest
0 голосов
/ 10 марта 2012

Я новичок в Silverlight и работаю с Simple MVVM для создания обучающего приложения. Автор Simple MVVM предлагает несколько хороших примеров привязки списка / подробных данных, но я ищу пример экрана для регистрации пользователя. Поскольку это внутреннее приложение, я могу передать идентификатор Windows с веб-сайта хостинга и сравнить его с базой данных пользователей. Если идентификатор пользователя не существует, я хотел бы отобразить регистрацию, где пользователь может ввести свое имя / фамилию и нажать кнопку «зарегистрироваться», чтобы сохранить новую запись пользователя. Похоже на простой шаблон, но я не смог понять это.

1 Ответ

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

Ну, мне удалось объединить несколько разных примеров и придумать пример, который работает.Это часть учебного приложения, которое я создаю.Это позволяет пользователям (в моем отделе ИТ) предлагать и голосовать за места для ланча.Для этого приложения посетителем является пользователь.Приведенный ниже код будет отображать экран с идентификатором окна пользователя (только для чтения) и вводом имени / фамилии в дополнение к кнопке «регистрация».

XAML (registerdinerview.xaml):

<navigation:Page x:Class="LTDestination.Views.RegisterDinerView" 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            mc:Ignorable="d"
            xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
            xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
            d:DesignWidth="640"
            d:DesignHeight="480"
            Title="RegisterDinerView Page"
            DataContext="{Binding Source={StaticResource Locator}, Path=RegisterDinerViewModel}"
          >
<navigation:Page.Resources>
    <Style TargetType="Button">
        <Style.Setters>
            <Setter Property="Height" Value="23"/>
            <Setter Property="Width" Value="60"/>
            <Setter Property="Margin" Value="5,0,0,0"/>
        </Style.Setters>
    </Style>
</navigation:Page.Resources>
<StackPanel x:Name="LayoutRoot">
    <StackPanel x:Name="ContentStackPanel">
        <TextBlock x:Name="HeaderText" Style="{StaticResource HeaderTextStyle}" Text="New User Registration"/>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <sdk:Label Content="User Id:" Grid.Row="0" />
            <TextBlock Grid.Row="0" Grid.Column="1" Height="30" Text="{Binding Path=Model.UserId}" />
            <sdk:Label Content="First Name:" Grid.Row="1" />
            <TextBox Grid.Row="1" Grid.Column="1" Height="30" Text="{Binding Path=Model.FirstName, Mode=TwoWay}" />
            <sdk:Label Content="Last Name:" Grid.Row="2" />
            <TextBox Grid.Row="2" Grid.Column="1" Height="30" Text="{Binding Path=Model.LastName, Mode=TwoWay}" />
            <Button x:Name="RegisterButton" Content="Register" Click="registerButton_Click"
                         Grid.Row="3" Grid.Column="1" Height="23" Width="75" HorizontalAlignment="Left" Margin="5,0,0,0"/>
        </Grid>
    </StackPanel>
</StackPanel>

Просмотреть код позади (registerdinerview.xaml.cs):

namespace LTDestination.Views
{
    public partial class RegisterDinerView : Page
    {

        RegisterDinerViewModel _ViewModel;

        public RegisterDinerView()
        {
            InitializeComponent();
            _ViewModel = (RegisterDinerViewModel)DataContext;
            _ViewModel.NewDiner();
        }

        private void registerButton_Click(object sender, RoutedEventArgs e)
        {
            _ViewModel.SaveChanges();
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

    }
}

ViewModel:

using System;

с использованием System.Collections.Generic;

// Пространство имен инструментария с использованием LTDestination.Services;используя LTDestination.Web;using SimpleMvvmToolkit;

пространство имен LTDestination.ViewModels {/// /// Этот класс расширяет ViewModelDetailBase, который реализует IEditableDataObject./// /// Укажите редактируемый тип DetailType в качестве аргумента второго типа /// и в качестве параметра для второго ctor./// /// /// Используйте фрагмент mvvmprop , чтобы добавить привязываемые свойства к этой модели представления./// /// открытый класс RegisterDinerViewModel: ViewModelDetailBase {#region Инициализация и очистка

    private IDinerServiceAgent serviceAgent;

    public RegisterDinerViewModel()
    {
    }

    public RegisterDinerViewModel(IDinerServiceAgent serviceAgent)
    {
        this.serviceAgent = serviceAgent;
    }

    #endregion

    #region Notifications

    public event EventHandler<NotificationEventArgs<Exception>> ErrorNotice;

    #endregion

    #region Properties

    private bool _IsBusy;
    public bool IsBusy
    {
        get { return _IsBusy; }
        set
        {
            _IsBusy = value;
            NotifyPropertyChanged(m => m.IsBusy);
        }
    }

    #endregion

    #region Methods

    public void NewDiner()
    {
        serviceAgent.GetDiners(DinersLoaded);
    }

    public void SaveChanges()
    {
        serviceAgent.AddDiner(base.Model);
        serviceAgent.SaveChanges(DinerSaved);
        IsBusy = true;
    }

    #endregion

    #region Completion Callbacks

    private void DinersLoaded(List<Diner> entities, Exception error)
    {
        // If no error is returned, set the model to entities
        if (error == null)
        {
            base.Model = new Diner { UserId = App.UserId, Active = true };
        }
        // Otherwise notify view that there's an error
        else
        {
            NotifyError("Unable to retrieve items", error);
        }

        // We're done
        IsBusy = false;
    }

    private void DinerSaved(Exception error)
    {
        if (error != null)
        {
            NotifyError("Unable to save diner", error);
        }
        else
        {
            MessageBus.Default.Notify(MessageTokens.Navigation, this, new NotificationEventArgs(PageNames.Home));
        }
    }

    #endregion

    #region Helpers

    // Helper method to notify View of an error
    private void NotifyError(string message, Exception error)
    {
        // Notify view of an error
        Notify(ErrorNotice, new NotificationEventArgs<Exception>(message, error));
    }

    #endregion
}

}

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