[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:
201
src/WPFEduSolution/WPFBeginner/ViewModels/MainWindowViewModel.cs
Normal file
201
src/WPFEduSolution/WPFBeginner/ViewModels/MainWindowViewModel.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user