Добавлены основные классы для MVVM, частично реализована страница входа.
This commit is contained in:
parent
a0e66de850
commit
afabd343f5
8 changed files with 218 additions and 25 deletions
|
|
@ -18,6 +18,7 @@ using SimpleInjector;
|
||||||
using Intersvyaz.Views;
|
using Intersvyaz.Views;
|
||||||
using Intersvyaz.Net;
|
using Intersvyaz.Net;
|
||||||
using Intersvyaz.Core.Services;
|
using Intersvyaz.Core.Services;
|
||||||
|
using Intersvyaz.ViewModels;
|
||||||
|
|
||||||
namespace Intersvyaz
|
namespace Intersvyaz
|
||||||
{
|
{
|
||||||
|
|
@ -121,6 +122,7 @@ namespace Intersvyaz
|
||||||
var container = new Container();
|
var container = new Container();
|
||||||
container.Register<IntersvyazClient>(Lifestyle.Singleton);
|
container.Register<IntersvyazClient>(Lifestyle.Singleton);
|
||||||
container.Register<ISessionService, SessionService>(Lifestyle.Transient);
|
container.Register<ISessionService, SessionService>(Lifestyle.Transient);
|
||||||
|
container.Register<LoginViewModel>(Lifestyle.Transient);
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
BIN
src/Intersvyaz/Assets/IntersvyazLogo.png
Normal file
BIN
src/Intersvyaz/Assets/IntersvyazLogo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
41
src/Intersvyaz/Common/BindableBase.cs
Normal file
41
src/Intersvyaz/Common/BindableBase.cs
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
namespace Intersvyaz.Common
|
||||||
|
{
|
||||||
|
public class BindableBase : INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Событие об изменении значения свойства.
|
||||||
|
/// </summary>
|
||||||
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Установка значения в заднее поля свойства с вызовом события.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип значения.</typeparam>
|
||||||
|
/// <param name="back">Заднее поле свойства.</param>
|
||||||
|
/// <param name="value">Новое значение.</param>
|
||||||
|
/// <param name="propertyName">Имя свойства. (Необязательный параметр)</param>
|
||||||
|
/// <remarks>При компилиции, имя свойства будет автоматически заполнено.</remarks>
|
||||||
|
protected void SetProperty<T>(ref T back, T value, [CallerMemberName] string propertyName = null)
|
||||||
|
{
|
||||||
|
if (!Equals(back, value))
|
||||||
|
{
|
||||||
|
back = value;
|
||||||
|
OnPropertyChanged(propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вызов события об изменении
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propertyName">Имя свойства. (Необязательный параметр)</param>
|
||||||
|
/// <remarks>При компилиции, имя свойства будет автоматически заполнено.</remarks>
|
||||||
|
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
|
||||||
|
{
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
56
src/Intersvyaz/Common/RelayCommand.cs
Normal file
56
src/Intersvyaz/Common/RelayCommand.cs
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
|
|
||||||
|
namespace Intersvyaz.Common
|
||||||
|
{
|
||||||
|
public class RelayCommand : ICommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Действие команды.
|
||||||
|
/// </summary>
|
||||||
|
private readonly Action<object> _execute;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Действие проверки «можно ли исполнить команду?».
|
||||||
|
/// </summary>
|
||||||
|
private readonly Predicate<object> _canExecute = null;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public event EventHandler CanExecuteChanged;
|
||||||
|
|
||||||
|
public RelayCommand(Action<object> execute)
|
||||||
|
{
|
||||||
|
_execute = execute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
|
||||||
|
{
|
||||||
|
_execute = execute;
|
||||||
|
_canExecute = canExecute;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public bool CanExecute(object parameter)
|
||||||
|
{
|
||||||
|
return _canExecute == null || _canExecute(parameter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public void Execute(object parameter)
|
||||||
|
{
|
||||||
|
_execute(parameter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вызов события изменения состояния.
|
||||||
|
/// </summary>
|
||||||
|
public void RaiseCanExecuteChanged()
|
||||||
|
{
|
||||||
|
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -119,7 +119,10 @@
|
||||||
<Compile Include="App.xaml.cs">
|
<Compile Include="App.xaml.cs">
|
||||||
<DependentUpon>App.xaml</DependentUpon>
|
<DependentUpon>App.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Common\BindableBase.cs" />
|
||||||
|
<Compile Include="Common\RelayCommand.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ViewModels\LoginViewModel.cs" />
|
||||||
<Compile Include="Views\LoginPage.xaml.cs">
|
<Compile Include="Views\LoginPage.xaml.cs">
|
||||||
<DependentUpon>LoginPage.xaml</DependentUpon>
|
<DependentUpon>LoginPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
@ -131,6 +134,9 @@
|
||||||
<None Include="Intersvyaz_TemporaryKey.pfx" />
|
<None Include="Intersvyaz_TemporaryKey.pfx" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="Assets\IntersvyazLogo.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="Properties\Default.rd.xml" />
|
<Content Include="Properties\Default.rd.xml" />
|
||||||
<Content Include="Assets\LockScreenLogo.scale-200.png" />
|
<Content Include="Assets\LockScreenLogo.scale-200.png" />
|
||||||
<Content Include="Assets\SplashScreen.scale-200.png" />
|
<Content Include="Assets\SplashScreen.scale-200.png" />
|
||||||
|
|
|
||||||
75
src/Intersvyaz/ViewModels/LoginViewModel.cs
Normal file
75
src/Intersvyaz/ViewModels/LoginViewModel.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
using Intersvyaz.Common;
|
||||||
|
using Intersvyaz.Core.Services;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace Intersvyaz.ViewModels
|
||||||
|
{
|
||||||
|
public class LoginViewModel : BindableBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Сервис сессии пользователя.
|
||||||
|
/// </summary>
|
||||||
|
private readonly ISessionService _sessionService;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Заднее поле имени пользователя.
|
||||||
|
/// </summary>
|
||||||
|
private string _username;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Заднее поле пароля пользователя.
|
||||||
|
/// </summary>
|
||||||
|
private string _password;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Имя пользователя.
|
||||||
|
/// </summary>
|
||||||
|
public string Username
|
||||||
|
{
|
||||||
|
get => _username;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref _username, value);
|
||||||
|
LoginCommand.RaiseCanExecuteChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Пароль пользователя.
|
||||||
|
/// </summary>
|
||||||
|
public string Password
|
||||||
|
{
|
||||||
|
get => _password;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref _password, value);
|
||||||
|
LoginCommand.RaiseCanExecuteChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Команда входа.
|
||||||
|
/// </summary>
|
||||||
|
public RelayCommand LoginCommand { get; }
|
||||||
|
|
||||||
|
public LoginViewModel(ISessionService sessionService)
|
||||||
|
{
|
||||||
|
_sessionService = sessionService;
|
||||||
|
|
||||||
|
LoginCommand = new RelayCommand(ExecuteLoginCommand, CanExecuteLoginCommand);
|
||||||
|
Username = Password = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ExecuteLoginCommand(object _)
|
||||||
|
{
|
||||||
|
var sessionData = await _sessionService.GetSessionAsync(Username, Password);
|
||||||
|
|
||||||
|
// TODO: Обработка данных об сессии
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CanExecuteLoginCommand(object _)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,9 +6,37 @@
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||||
|
DataContext="{x:Bind ViewModel}">
|
||||||
|
|
||||||
<Grid>
|
<Grid VerticalAlignment="Center"
|
||||||
<TextBlock Text="LoginPage" />
|
Margin="10">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<Image Source="ms-appx:///Assets/IntersvyazLogo.png"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Margin="0,0,0,10"
|
||||||
|
Height="64"
|
||||||
|
Grid.Row="0" />
|
||||||
|
|
||||||
|
<TextBox PlaceholderText="логин"
|
||||||
|
Text="{Binding Username,Mode=TwoWay}"
|
||||||
|
Margin="0,0,0,10"
|
||||||
|
Grid.Row="1" />
|
||||||
|
|
||||||
|
<PasswordBox PlaceholderText="пароль"
|
||||||
|
Password="{Binding Password,Mode=TwoWay}"
|
||||||
|
Grid.Row="2" />
|
||||||
|
|
||||||
|
<Button Content="войти"
|
||||||
|
Command="{Binding LoginCommand}"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
Grid.Row="3" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Page>
|
</Page>
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,19 @@
|
||||||
using System;
|
using Windows.UI.Xaml.Controls;
|
||||||
using System.Collections.Generic;
|
using Intersvyaz.ViewModels;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices.WindowsRuntime;
|
|
||||||
using Windows.Foundation;
|
|
||||||
using Windows.Foundation.Collections;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using Windows.UI.Xaml.Controls.Primitives;
|
|
||||||
using Windows.UI.Xaml.Data;
|
|
||||||
using Windows.UI.Xaml.Input;
|
|
||||||
using Windows.UI.Xaml.Media;
|
|
||||||
using Windows.UI.Xaml.Navigation;
|
|
||||||
using Intersvyaz.Core.Services;
|
|
||||||
|
|
||||||
namespace Intersvyaz.Views
|
namespace Intersvyaz.Views
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Страница входа.
|
|
||||||
/// </summary>
|
|
||||||
public sealed partial class LoginPage : Page
|
public sealed partial class LoginPage : Page
|
||||||
{
|
{
|
||||||
private readonly ISessionService _sessionService;
|
/// <summary>
|
||||||
|
/// Модель представления страницы входа.
|
||||||
|
/// </summary>
|
||||||
|
public LoginViewModel ViewModel { get; }
|
||||||
|
|
||||||
public LoginPage()
|
public LoginPage()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
ViewModel = App.Current.Services.GetInstance<LoginViewModel>();
|
||||||
// NOTE: Получение сервисов
|
|
||||||
_sessionService = App.Current.Services.GetInstance<ISessionService>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue