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 등)를 처리하는 여러 보조 클래스들이 추가되었습니다.
202 lines
5.9 KiB
C#
202 lines
5.9 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|