[build] 토이 프로젝트 작업 변경

1. .gitignore 파일이 추가되어, 컴파일된 바이너리, 로그, 임시 파일 등이 Git 추적에서 제외되었습니다.
2. WPF의 MVVM 패턴을 따르는 여러 뷰(LoginWindow.xaml, MainWindow.xaml, RegistMemberWindow.xaml), 뷰 모델(LoginWindowViewModel.cs, MainWindowViewModel.cs, RegistMemberWindowViewModel.cs), 그리고 모델(Member.cs)이 추가되었습니다.
3. 리소스 및 스타일 정의를 포함한 XAML 리소스 파일(DefaultTheme.xaml, LightTheme.xaml, Buttons.xaml 등)이 추가되어 UI의 모양과 느낌을 커스터마이즈할 수 있게 되었습니다.
4. 애플리케이션 설정(AppSettings.cs)과 관련된 설정 파일과 로그인 정보(LoginInfo.cs)를 처리하는 코드가 추가되었습니다.
5. 이미지 리소스(bg_login.jpeg, btn_search_001.png, ico_pw.png, ico_user.png)가 추가되어 UI에 사용됩니다.
6. 유틸리티 및 서비스(ResourceExplorer.cs, ViewModelLocator.cs 등)를 처리하는 여러 보조 클래스들이 추가되었습니다.
This commit is contained in:
최준영
2024-04-01 17:28:41 +09:00
commit bfde26dee5
42 changed files with 2627 additions and 0 deletions

View File

@@ -0,0 +1,201 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
using WPFBeginner.Models;
using WPFBeginner.Services;
using WPFBeginner.Views;
namespace WPFBeginner.ViewModels
{
public partial class MainWindowViewModel : ObservableRecipient
{
private ObservableCollection<Member> members;
public ObservableCollection<Member> Members
{
get
{
if(filterMemebers != null)
return filterMemebers;
return members;
}
set => SetProperty(ref members, value);
}
private ObservableCollection<Member> filterMemebers;
[ObservableProperty]
private Member selectedMember;
private Member searchModel;
public string MemberName
{
get => searchModel?.Name;
set
{
if (searchModel == null)
searchModel = new Member();
searchModel.Name = value;
OnPropertyChanged();
}
}
public string Call
{
get => searchModel?.Call;
set
{
if (searchModel == null)
searchModel = new Member();
searchModel.Call = value;
OnPropertyChanged();
}
}
public string EmployeeNo
{
get => searchModel?.EmployeeNo;
set
{
if (searchModel == null)
searchModel = new Member();
searchModel.EmployeeNo = value;
OnPropertyChanged();
}
}
public string EMail
{
get => searchModel.EMail;
set
{
if (searchModel == null)
searchModel = new Member();
searchModel.EMail = value;
OnPropertyChanged();
}
}
private bool isKorean;
public bool IsKorean
{
get => isKorean;
set
{
SetProperty(ref isKorean, value);
App.Config.Language = value ? "ko-KR" : "en-US";
}
}
private bool isDefaultTheme;
public bool IsDefaultTheme
{
get => isDefaultTheme;
set
{
SetProperty(ref isDefaultTheme, value);
App.Config.Theme = value ? "DefaultTheme" : "LightTheme";
}
}
public ICommand SearchClickCommand => new RelayCommand(() =>
{
var errorMessage = ValidateSearchValues();
if (errorMessage != null)
{
MessageBox.Show(errorMessage);
filterMemebers = null;
return;
}
IEnumerable<Member> result = Members;
if (!string.IsNullOrWhiteSpace(MemberName))
result = result.Where(i => i.Name?.Contains(MemberName) ?? false);
if (!string.IsNullOrWhiteSpace(EMail))
result = result.Where(i => i.EMail?.Contains(EMail) ?? false);
if (!string.IsNullOrWhiteSpace(Call))
result = result.Where(i => i.Call?.Contains(Call) ?? false);
if (!string.IsNullOrWhiteSpace(EmployeeNo))
result = result.Where(i => i.EmployeeNo?.Contains(EmployeeNo) ?? false);
if (result == null)
filterMemebers = new ObservableCollection<Member>();
else
filterMemebers = new ObservableCollection<Member>(result);
OnPropertyChanged(nameof(Members));
});
private string ValidateSearchValues()
{
if (string.IsNullOrWhiteSpace(MemberName)
&& string.IsNullOrWhiteSpace(EmployeeNo)
&& string.IsNullOrWhiteSpace(Call)
&& string.IsNullOrWhiteSpace(EMail))
return ResourceExplorer.GetStringResource("Cultures.MainWindow.ErrorMessage.SearchConditionEmpty");
return null;
}
public ICommand DeleteClickCommand => new RelayCommand(() =>
{
if (SelectedMember == null)
return;
Members.Remove(SelectedMember);
});
public ICommand InitClickCommand => new RelayCommand(() =>
{
filterMemebers = null;
searchModel = new Member();
OnPropertyChanged(nameof(MemberName));
OnPropertyChanged(nameof(EmployeeNo));
OnPropertyChanged(nameof(EMail));
OnPropertyChanged(nameof(Call));
OnPropertyChanged(nameof(Members));
});
public ICommand AddClickCommand => new RelayCommand(() =>
{
var registDialog = new RegistMemberWindow();
var result = registDialog.ShowDialog();
if (result == true)
{
var dx = registDialog.DataContext as RegistMemberWindowViewModel;
if (dx == null)
return;
Members.Add(Member.Create(dx.MemberName, dx.Call, dx.Email, dx.EmployeeNo));
}
});
public MainWindowViewModel()
{
CreateDefaultMember();
searchModel = new Member();
isKorean = App.Config.Language.Equals("ko-KR", StringComparison.OrdinalIgnoreCase);
isDefaultTheme = App.Config.Theme.Equals("DefaultTheme", StringComparison.OrdinalIgnoreCase);
}
private void CreateDefaultMember()
{
members = new ObservableCollection<Member>();
foreach (var member in App.Config.Members)
members.Add(Member.Create(member.Name, member.Call, member.EMail, member.EmployeeNo));
OnPropertyChanged(nameof(Members));
}
}
}