728x90
반응형
728x170
▶ GroupInfoList.cs
using System.Collections.Generic;
namespace TestProject
{
/// <summary>
/// 그룹 정보 리스트
/// </summary>
public class GroupInfoList : List<object>
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 키 - Key
/// <summary>
/// 키
/// </summary>
public object Key { get; set; }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - GroupInfoList(itemEnumerable)
/// <summary>
/// 생성자
/// </summary>
/// <param name="itemEnumerable">항목 열거 가능형</param>
public GroupInfoList(IEnumerable<object> itemEnumerable) : base(itemEnumerable)
{
}
#endregion
}
}
728x90
▶ Contact.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using Windows.Storage;
namespace TestProject
{
/// <summary>
/// 연락
/// </summary>
public class Contact
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 이름 - FirstName
/// <summary>
/// 이름
/// </summary>
public string FirstName { get; private set; }
#endregion
#region 성 - LastName
/// <summary>
/// 성
/// </summary>
public string LastName { get; private set; }
#endregion
#region 회사 - Company
/// <summary>
/// 회사
/// </summary>
public string Company { get; private set; }
#endregion
#region 성명 - Name
/// <summary>
/// 성명
/// </summary>
public string Name => FirstName + " " + LastName;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - Contact(firstName, lastName, company)
/// <summary>
/// 생성자
/// </summary>
/// <param name="firstName">이름</param>
/// <param name="lastName">성</param>
/// <param name="company">회사</param>
public Contact(string firstName, string lastName, string company)
{
FirstName = firstName;
LastName = lastName;
Company = company;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 컬렉션 구하기 (비동기) - GetCollectionAsync()
/// <summary>
/// 컬렉션 구하기 (비동기)
/// </summary>
/// <returns>컬렉션</returns>
public static async Task<ObservableCollection<Contact>> GetCollectionAsync()
{
StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///DATA/Contacts.txt"));
IList<string> lineList = await FileIO.ReadLinesAsync(storageFile);
ObservableCollection<Contact> collection = new ObservableCollection<Contact>();
for(int i = 0; i < lineList.Count; i += 3)
{
collection.Add(new Contact(lineList[i], lineList[i + 1], lineList[i + 2]));
}
return collection;
}
#endregion
#region 그룹 컬렉션 구하기 (비동기) - GetGroupCollectionAsync()
/// <summary>
/// 그룹 컬렉션 구하기 (비동기)
/// </summary>
/// <returns>그룹 컬렉션</returns>
public static async Task<ObservableCollection<GroupInfoList>> GetGroupCollectionAsync()
{
IEnumerable<GroupInfoList> query = from item in await GetCollectionAsync()
group item by item.LastName.Substring(0, 1).ToUpper() into itemGroup
orderby itemGroup.Key
select new GroupInfoList(itemGroup) { Key = itemGroup.Key };
return new ObservableCollection<GroupInfoList>(query);
}
#endregion
#region 문자열 구하기 - ToString()
/// <summary>
/// 문자열 구하기
/// </summary>
/// <returns>문자열</returns>
public override string ToString()
{
return Name;
}
#endregion
}
}
300x250
▶ MainPage.xaml
<Page x:Class="TestProject.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestProject"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
FontFamily="나눔고딕코딩"
FontSize="16">
<Page.Resources>
<Style x:Key="BaseTextBlockStyleKey" TargetType="TextBlock">
<Setter Property="LineStackingStrategy" Value="MaxHeight" />
<Setter Property="TextLineBounds" Value="Full" />
<Setter Property="TextTrimming" Value="None" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="FontFamily" Value="XamlAutoFontFamily" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="FontSize" Value="14" />
</Style>
<DataTemplate x:Key="ListViewDataTemplateKey" x:DataType="local:Contact">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Ellipse Grid.Row="0" Grid.RowSpan="2" Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="5"
Width ="32"
Height="32"
Fill="{ThemeResource SystemControlBackgroundBaseMediumBrush}" />
<TextBlock Grid.Row="0" Grid.Column="1"
Style="{ThemeResource BaseTextBlockStyleKey}"
Margin="10 5 0 0"
x:Phase="1"
Text="{x:Bind Name}" />
<TextBlock Grid.Row="1" Grid.Column="1"
Style="{ThemeResource BaseTextBlockStyleKey}"
Margin="10 0 0 5"
x:Phase="2"
Text="{x:Bind Company}" />
</Grid>
</DataTemplate>
</Page.Resources>
<Grid>
<Grid
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ListView Name="listView" Grid.Column="0"
ItemTemplate="{StaticResource ListViewDataTemplateKey}"
Height="400"
Width="400"
BorderThickness="1"
BorderBrush="{ThemeResource SystemControlForegroundBaseMediumLowBrush}"
SelectionMode="Single"
ShowsScrollingPlaceholders="True" />
<StackPanel Grid.Column="2"
Width="200">
<TextBlock
Margin="10 10 10 0"
Style="{ThemeResource BaseTextBlockStyleKey}"
Text="조회 조건" />
<TextBox Name="firstNameTextBox"
Header="이름"
Margin="10"
HorizontalAlignment="Stretch"
TextChanged="filterTextBox_TextChanged" />
<TextBox Name="lastNameTextBox"
Header="성"
Margin="10"
HorizontalAlignment="Stretch"
TextChanged="filterTextBox_TextChanged" />
<TextBox Name="companyTextBox"
Header="회사"
Margin="10"
HorizontalAlignment="Stretch"
TextChanged="filterTextBox_TextChanged" />
</StackPanel>
</Grid>
</Grid>
</Page>
▶ MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Windows.Foundation;
using Windows.Graphics.Display;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace TestProject
{
/// <summary>
/// 메인 페이지
/// </summary>
public sealed partial class MainPage : Page
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 소스 컬렉션
/// </summary>
ObservableCollection<Contact> sourceCollection = new ObservableCollection<Contact>();
/// <summary>
/// 필터 컬렉션
/// </summary>
ObservableCollection<Contact> filterCollection = new ObservableCollection<Contact>();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainPage()
/// <summary>
/// 생성자
/// </summary>
public MainPage()
{
InitializeComponent();
#region 윈도우 크기를 설정한다.
double width = 800d;
double height = 600d;
double dpi = (double)DisplayInformation.GetForCurrentView().LogicalDpi;
ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize;
Size windowSize = new Size(width * 96d / dpi, height * 96d / dpi);
ApplicationView.PreferredLaunchViewSize = windowSize;
Window.Current.Activate();
ApplicationView.GetForCurrentView().TryResizeView(windowSize);
#endregion
#region 윈도우 제목을 설정한다.
ApplicationView.GetForCurrentView().Title = "ListView 엘리먼트 : 필터 사용하기";
#endregion
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Protected
#region 탐색되는 경우 처리하기 - OnNavigatedTo(e)
/// <summary>
/// 탐색되는 경우 처리하기
/// </summary>
/// <param name="e">이벤트 인자</param>
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
this.sourceCollection = await Contact.GetCollectionAsync();
this.filterCollection = new ObservableCollection<Contact>(this.sourceCollection);
this.listView.ItemsSource = this.filterCollection;
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 필터 텍스트 박스 텍스트 변경시 처리하기 - filterTextBox_TextChanged(sender, e)
/// <summary>
/// 필터 텍스트 박스 텍스트 변경시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void filterTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
IEnumerable<Contact> filterEnumerable = this.sourceCollection.Where(contact => Filter(contact));
RemoveData(filterEnumerable);
AddData(filterEnumerable);
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 필터 적용하기 - Filter(contact)
/// <summary>
/// 필터 적용하기
/// </summary>
/// <param name="contact">연락처</param>
/// <returns>처리 결과</returns>
private bool Filter(Contact contact)
{
return contact.FirstName.Contains(this.firstNameTextBox.Text, StringComparison.InvariantCultureIgnoreCase) &&
contact.LastName.Contains(this.lastNameTextBox.Text, StringComparison.InvariantCultureIgnoreCase) &&
contact.Company.Contains(this.companyTextBox.Text, StringComparison.InvariantCultureIgnoreCase);
}
#endregion
#region 데이터 제거하기 - RemoveData(filterEnumerable)
/// <summary>
/// 데이터 제거하기
/// </summary>
/// <param name="filterEnumerable">필터 열거 가능형</param>
private void RemoveData(IEnumerable<Contact> filterEnumerable)
{
for(int i = this.filterCollection.Count - 1; i >= 0; i--)
{
Contact contact = filterCollection[i];
if(!filterEnumerable.Contains(contact))
{
filterCollection.Remove(contact);
}
}
}
#endregion
#region 데이터 추가하기 - AddData(filterEnumerable)
/// <summary>
/// 데이터 추가하기
/// </summary>
/// <param name="filterEnumerable">필터 열거 가능형</param>
private void AddData(IEnumerable<Contact> filterEnumerable)
{
foreach(Contact contact in filterEnumerable)
{
if(!filterCollection.Contains(contact))
{
filterCollection.Add(contact);
}
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > UWP' 카테고리의 다른 글
[C#/UWP] TreeView 엘리먼트 : ItemsSource 속성 사용하기 (0) | 2021.06.23 |
---|---|
[C#/UWP] TreeView 엘리먼트 : SelectionMode 속성을 사용해 멀티 선택하기 (0) | 2021.06.23 |
[C#/UWP] TreeView 엘리먼트 : AllowDrop/CanDragItems 속성을 사용해 드래그 & 드롭 지원하기 (0) | 2021.06.23 |
[C#/UWP] ListView 엘리먼트 : 이미지를 갖는 항목 표시하기 (0) | 2021.06.23 |
[C#/UWP] ListView 엘리먼트 : 로그 또는 메시지 표시시 아래에서부터 항목 추가하기 (0) | 2021.06.23 |
[C#/UWP] ListView 엘리먼트 : 그룹 헤더 사용하기 (0) | 2021.06.22 |
[C#/UWP] ListView 엘리먼트 : DragItemsStarting/DragEnter/DragOver/Drop 이벤트 사용하기 (0) | 2021.06.22 |
[C#/UWP] ListView 엘리먼트 : SelectionMode 속성 사용하기 (0) | 2021.06.22 |
[C#/UWP] ListView 엘리먼트 : ItemTemplate 속성 사용하기 (0) | 2021.06.22 |
[C#/UWP] FileIO 클래스 : ReadLinesAsync 정적 메소드를 사용해 특정 텍스트 파일 내용 읽기 (0) | 2021.06.22 |
댓글을 달아 주세요