728x90
반응형
728x170
▶ ColumnItem.cs
using System.ComponentModel;
using System.Windows.Media;
namespace TestProject
{
/// <summary>
/// 컬럼 항목
/// </summary>
public class ColumnItem : INotifyPropertyChanged
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Event
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 속성 변경시 이벤트 - PropertyChanged
/// <summary>
/// 속성 변경시 이벤트
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 체크 여부
/// </summary>
private bool isChecked;
/// <summary>
/// 아이콘
/// </summary>
private ImageSource icon;
/// <summary>
/// 값
/// </summary>
private string value;
/// <summary>
/// 텍스트
/// </summary>
private string text;
/// <summary>
/// 내림차순 여부
/// </summary>
private bool isDescending;
/// <summary>
/// 태그
/// </summary>
private object tag;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 체크 여부 - IsChecked
/// <summary>
/// 체크 여부
/// </summary>
public bool IsChecked
{
get
{
return this.isChecked;
}
set
{
if(this.isChecked == value)
{
return;
}
this.isChecked = value;
FirePropertyChanged("IsChecked");
}
}
#endregion
#region 아이콘 - Icon
/// <summary>
/// 아이콘
/// </summary>
public ImageSource Icon
{
get
{
return this.icon;
}
set
{
if(this.icon == value)
{
return;
}
this.icon = value;
FirePropertyChanged("Icon");
}
}
#endregion
#region 값 - Value
/// <summary>
/// 값
/// </summary>
public string Value
{
get
{
return this.value;
}
set
{
if(this.value == value)
{
return;
}
this.value = value;
FirePropertyChanged("Value");
}
}
#endregion
#region 텍스트 - Text
/// <summary>
/// 텍스트
/// </summary>
public string Text
{
get
{
return this.text;
}
set
{
if(this.text == value)
{
return;
}
this.text = value;
FirePropertyChanged("Text");
}
}
#endregion
#region 내림차순 여부 - IsDescending
/// <summary>
/// 내림차순 여부
/// </summary>
public bool IsDescending
{
get
{
return this.isDescending;
}
set
{
if(this.isDescending == value)
{
return;
}
this.isDescending = value;
FirePropertyChanged("IsDescending");
}
}
#endregion
#region 태그 - Tag
/// <summary>
/// 태그
/// </summary>
public object Tag
{
get
{
return this.tag;
}
set
{
if(this.tag == value)
{
return;
}
this.tag = value;
FirePropertyChanged("Tag");
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - CoulmnItem()
/// <summary>
/// 생성자
/// </summary>
public ColumnItem()
{
this.isChecked = false;
this.icon = null;
this.value = null;
this.text = null;
this.isDescending = false;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(value)
/// <summary>
/// 생성자
/// </summary>
/// <param name="value">값</param>
public ColumnItem(string value)
{
this.isChecked = false;
this.icon = null;
this.value = value;
this.text = value;
this.isDescending = false;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(value, text)
/// <summary>
/// 생성자
/// </summary>
/// <param name="value">값</param>
/// <param name="text">텍스트</param>
public ColumnItem(string value, string text)
{
this.isChecked = false;
this.icon = null;
this.value = value;
this.text = text;
this.isDescending = false;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(isChecked, value)
/// <summary>
/// 생성자
/// </summary>
/// <param name="isChecked">체크 여부</param>
/// <param name="value">값</param>
public ColumnItem(bool isChecked, string value)
{
this.isChecked = isChecked;
this.icon = null;
this.value = value;
this.text = value;
this.isDescending = false;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(icon, value)
/// <summary>
/// 생성자
/// </summary>
/// <param name="icon">아이콘</param>
/// <param name="value">값</param>
public ColumnItem(ImageSource icon, string value)
{
this.isChecked = false;
this.icon = icon;
this.value = value;
this.text = value;
this.isDescending = false;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(isChecked, icon, value, text)
/// <summary>
/// 생성자
/// </summary>
/// <param name="isChecked">체크 여부</param>
/// <param name="icon">아이콘</param>
/// <param name="value">값</param>
/// <param name="text">텍스트</param>
public ColumnItem(bool isChecked, ImageSource icon, string value, string text)
{
this.isChecked = isChecked;
this.icon = icon;
this.value = value;
this.text = text;
this.isDescending = false;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(isChecked, value, text, isDescending)
/// <summary>
/// 생성자
/// </summary>
/// <param name="isChecked">체크 여부</param>
/// <param name="value">값</param>
/// <param name="text">텍스트</param>
/// <param name="isDescending">내림차순 여부</param>
public ColumnItem(bool isChecked, string value, string text, bool isDescending)
{
this.isChecked = isChecked;
this.icon = null;
this.value = value;
this.text = text;
this.isDescending = isDescending;
this.tag = null;
}
#endregion
#region 생성자 - ColumnItem(isChecked, icon, value, text, isDescending)
/// <summary>
/// 생성자
/// </summary>
/// <param name="isChecked">체크 여부</param>
/// <param name="icon">아이콘</param>
/// <param name="value">값</param>
/// <param name="text">텍스트</param>
/// <param name="isDescending">내림차순 여부</param>
public ColumnItem(bool isChecked, ImageSource icon, string value, string text, bool isDescending)
{
this.isChecked = isChecked;
this.icon = icon;
this.value = value;
this.text = text;
this.isDescending = isDescending;
this.tag = null;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 문자열 구하기 - ToString()
/// <summary>
/// 문자열 구하기
/// </summary>
/// <returns>문자열</returns>
public override string ToString()
{
return this.text;
}
#endregion
#region 새 항목 구하기 - GetNewItem()
/// <summary>
/// 새 항목 구하기
/// </summary>
/// <returns>새 항목</returns>
public ColumnItem GetNewItem()
{
ColumnItem item = new ColumnItem();
item.isChecked = this.isChecked;
item.icon = this.icon;
item.value = this.value;
item.text = this.text;
item.isDescending = this.isDescending;
item.tag = this.tag;
return item;
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Protected
#region 속성 변경시 이벤트 발생시키기 - FirePropertyChanged(proertyName)
/// <summary>
/// 속성 변경시 이벤트 발생시키기
/// </summary>
/// <param name="proertyName">속성명</param>
protected void FirePropertyChanged(string proertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(proertyName));
}
}
#endregion
}
}
728x90
▶ ColumnListBox.xaml
<ListBox x:Class="TestProject.ColumnListBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:local="clr-namespace:TestProject"
mc:Ignorable="d"
d:DesignWidth="200"
d:DesignHeight="300"
SelectionMode="Extended">
<ListBox.Resources>
<local:BoleanRerverseConverter x:Key="BoleanRerverseConverterKey" />
<local:ShowSortOrderToVisibilityConverter x:Key="ShowSortOrderToVisibilityConverterKey" />
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}, Mode=FindAncestor}, Path=ActualWidth}"
LastChildFill="True">
<BulletDecorator DockPanel.Dock="Left"
VerticalAlignment="Center"
SnapsToDevicePixels="true"
Background="Transparent">
<BulletDecorator.Bullet>
<themes:BulletChrome
BorderBrush="Black"
IsRound="{Binding Path=SingleSelect, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, Mode=FindAncestor}}"
IsChecked="{Binding IsChecked}"
RenderMouseOver="{TemplateBinding IsMouseOver}" />
</BulletDecorator.Bullet>
</BulletDecorator>
<Image Name="image" DockPanel.Dock="Left"
VerticalAlignment="Center"
Margin="5 0 0 0"
Width="16"
Height="16"
SnapsToDevicePixels="true"
Stretch="Uniform"
Source="{Binding Icon}" />
<StackPanel Name="sortOrderStackPanel" DockPanel.Dock="Right"
Margin="5 0 5 0"
Orientation="Horizontal"
Visibility="{Binding Path=ShowSortOrder, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, Mode=FindAncestor}, Converter={StaticResource ShowSortOrderToVisibilityConverterKey}}">
<RadioButton
VerticalAlignment="Center"
Margin="10 0 0 0"
VerticalContentAlignment="Center"
GroupName="{Binding Value}"
IsChecked="{Binding Path=IsDescending, Converter={StaticResource BoleanRerverseConverterKey}}"
Content="ASC" />
<RadioButton
VerticalAlignment="Center"
Margin="5 0 10 0"
VerticalContentAlignment="Center"
GroupName="{Binding Value}"
IsChecked="{Binding Path=IsDescending}"
Content="DESC" />
</StackPanel>
<TextBlock Name="textTextBlock"
Margin="5 0 0 0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Foreground="{Binding Path=TextBrush, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, Mode=FindAncestor}}"
Text="{Binding Text}" />
</DockPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Icon}" Value="{x:Null}">
<Setter TargetName="image" Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Value}" Value="(INITIALIZE)">
<Setter TargetName="sortOrderStackPanel" Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding IsChecked}" Value="false">
<Setter TargetName="sortOrderStackPanel" Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding IsChecked}" Value="true">
<Setter TargetName="textTextBlock" Property="Foreground" Value="{Binding Path=CheckedTextBrush, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, Mode=FindAncestor}}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Template>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border
CornerRadius="{Binding Path=CornerRadius, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, Mode=FindAncestor}}"
Padding="{TemplateBinding Padding}"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
<ItemsPresenter/>
</ScrollViewer>
</Border>
</ControlTemplate>
</ListBox.Template>
</ListBox>
300x250
▶ ColumnListBox.xaml.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace TestProject
{
/// <summary>
/// 컬럼 리스트 박스
/// </summary>
public partial class ColumnListBox : ListBox, IDisposable
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Event
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 체크 값 목록 변경시 이벤트 - CheckedValuesChanged
/// <summary>
/// 체크 값 목록 변경시 이벤트
/// </summary>
public event EventHandler CheckedValuesChanged;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 코너 반지름 의존 속성 - CornerRadiusProperty
/// <summary>
/// 코너 반지름 의존 속성
/// </summary>
public static readonly DependencyProperty CornerRadiusProperty;
#endregion
#region 단일 선택 여부 의존 속성 - SingleSelectProperty
/// <summary>
/// 단일 선택 여부 의존 속성
/// </summary>
public static readonly DependencyProperty SingleSelectProperty;
#endregion
#region 텍스트 브러시 의존 속성 - TextBrushProperty
/// <summary>
/// 텍스트 브러시 의존 속성
/// </summary>
public static readonly DependencyProperty TextBrushProperty;
#endregion
#region 체크 텍스트 브러시 의존 속성 - CheckedTextBrushProperty
/// <summary>
/// 체크 텍스트 브러시 의존 속성
/// </summary>
public static readonly DependencyProperty CheckedTextBrushProperty;
#endregion
#region 체크 값 목록 의존 속성 - CheckedValuesProperty
/// <summary>
/// 체크 값 목록 의존 속성
/// </summary>
public static readonly DependencyProperty CheckedValuesProperty;
#endregion
#region 체크 텍스트 목록 의존 속성 - CheckedTextsProperty
/// <summary>
/// 체크 텍스트 목록 의존 속성
/// </summary>
public static readonly DependencyProperty CheckedTextsProperty;
#endregion
#region 체크 항목 리스트 의존 속성 - CheckedItemListProperty
/// <summary>
/// 체크 항목 리스트 의존 속성
/// </summary>
public static readonly DependencyProperty CheckedItemListProperty;
#endregion
#region 정렬 순서 표시 여부 의존 속성 - ShowSortOrderProperty
/// <summary>
/// 정렬 순서 표시 여부 의존 속성
/// </summary>
public static readonly DependencyProperty ShowSortOrderProperty;
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 라디오 버튼 CHECKED 이벤트 핸들러
/// </summary>
private RoutedEventHandler radioButtonCheckedEventHandler = null;
/// <summary>
/// 리스트 박스 PREVIEW MOUSE DOWN 이벤트 핸들러
/// </summary>
private MouseButtonEventHandler listBoxPreviewMouseDownEventHandler = null;
/// <summary>
/// 리스트 박스 PREVIEW MOUSE UP 이벤트 핸들러
/// </summary>
private MouseButtonEventHandler listBoxPreviewMouseUpEventHandler = null;
/// <summary>
/// 리스트 박스 PREVIEW KEY DOWN 이벤트 핸들러
/// </summary>
private KeyEventHandler listBoxPreviewKeyDownEventHandler = null;
/// <summary>
/// 내부용 체크 값 목록 설정 여부
/// </summary>
private bool setCheckedValuesInternally = false;
/// <summary>
/// 드래그 시작 인덱스
/// </summary>
private int dragStartIndex = -1;
/// <summary>
/// 드래그 종료 인덱스
/// </summary>
private int dragEndIndex = -1;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 코너 반지름 - CornerRadius
/// <summary>
/// 코너 반지름
/// </summary>
public double CornerRadius
{
get
{
return (double)GetValue(CornerRadiusProperty);
}
set
{
SetValue(CornerRadiusProperty, value);
}
}
#endregion
#region 단일 선택 여부 - SingleSelect
/// <summary>
/// 단일 선택 여부
/// </summary>
public bool SingleSelect
{
get
{
return (bool)GetValue(SingleSelectProperty);
}
set
{
SetValue(SingleSelectProperty, value);
}
}
#endregion
#region 텍스트 브러시 - TextBrush
/// <summary>
/// 텍스트 브러시
/// </summary>
public Brush TextBrush
{
get
{
return (Brush)GetValue(TextBrushProperty);
}
set
{
SetValue(TextBrushProperty, value);
}
}
#endregion
#region 체크 텍스트 브러시 - CheckedTextBrush
/// <summary>
/// 체크 텍스트 브러시
/// </summary>
public Brush CheckedTextBrush
{
get
{
return (Brush)GetValue(CheckedTextBrushProperty);
}
set
{
SetValue(CheckedTextBrushProperty, value);
}
}
#endregion
#region 체크 값 목록 - CheckedValues
/// <summary>
/// 체크 값 목록
/// </summary>
public string CheckedValues
{
get
{
return (string)GetValue(CheckedValuesProperty);
}
set
{
SetValue(CheckedValuesProperty, value);
}
}
#endregion
#region 체크 텍스트 목록 - CheckedTexts
/// <summary>
/// 체크 텍스트 목록
/// </summary>
public string CheckedTexts
{
get
{
return (string)GetValue(CheckedTextsProperty);
}
set
{
SetValue(CheckedTextsProperty, value);
}
}
#endregion
#region 체크 항목 리스트 - CheckedItemList
/// <summary>
/// 체크 항목 리스트
/// </summary>
public IList<ColumnItem> CheckedItemList
{
get
{
return (IList<ColumnItem>)GetValue(CheckedItemListProperty);
}
set
{
SetValue(CheckedItemListProperty, value);
}
}
#endregion
#region 정렬 순서 표시 여부 - ShowSortOrder
/// <summary>
/// 정렬 순서 표시 여부
/// </summary>
public bool ShowSortOrder
{
get
{
return (bool)GetValue(ShowSortOrderProperty);
}
set
{
SetValue(ShowSortOrderProperty, value);
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Static
#region 생성자 - ColumnListBox()
/// <summary>
/// 생성자
/// </summary>
static ColumnListBox()
{
CornerRadiusProperty = UIHelper.RegisterDependencyProperty
(
0d,
true,
true,
false,
true,
null,
"CornerRadius",
typeof(double),
typeof(ColumnListBox),
null
);
SingleSelectProperty = UIHelper.RegisterDependencyProperty
(
false,
false,
false,
false,
true,
singleSelectPropertyChangedCallback,
"SingleSelect",
typeof(bool),
typeof(ColumnListBox),
null
);
TextBrushProperty = UIHelper.RegisterDependencyProperty
(
Brushes.Black,
false,
true,
false,
true,
null,
"TextBrush",
typeof(Brush),
typeof(ColumnListBox),
null
);
CheckedTextBrushProperty = UIHelper.RegisterDependencyProperty
(
Brushes.Black,
false,
true,
false,
true,
null,
"CheckedTextBrush",
typeof(Brush),
typeof(ColumnListBox),
null
);
CheckedValuesProperty = UIHelper.RegisterDependencyProperty
(
string.Empty,
false,
false,
false,
true,
checkedValuesPropertyChangedCallback,
"CheckedValues",
typeof(string),
typeof(ColumnListBox),
null
);
CheckedTextsProperty = UIHelper.RegisterDependencyProperty
(
string.Empty,
false,
false,
false,
true,
null,
"CheckedTexts",
typeof(string),
typeof(ColumnListBox),
null
);
CheckedItemListProperty = UIHelper.RegisterDependencyProperty
(
null,
false,
false,
false,
true,
null,
"CheckedItemList",
typeof(IList<ColumnItem>),
typeof(ColumnListBox),
null
);
ShowSortOrderProperty = UIHelper.RegisterDependencyProperty
(
false,
false,
false,
false,
true,
showSortOrderPropertyChangedCallback,
"ShowSortOrder",
typeof(bool),
typeof(ColumnListBox),
null
);
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - ColumnListBox()
/// <summary>
/// 생성자
/// </summary>
public ColumnListBox()
{
InitializeComponent();
this.radioButtonCheckedEventHandler = new RoutedEventHandler(RadioButton_Checked);
this.listBoxPreviewMouseDownEventHandler = new MouseButtonEventHandler(ListBox_PreviewMouseDown);
this.listBoxPreviewMouseUpEventHandler = new MouseButtonEventHandler(ListBox_PreviewMouseUp );
this.listBoxPreviewKeyDownEventHandler = new KeyEventHandler (ListBox_PreviewKeyDown );
AddRadioButtonHandler();
AddHandler(ListBox.PreviewMouseDownEvent, this.listBoxPreviewMouseDownEventHandler);
AddHandler(ListBox.PreviewMouseUpEvent , this.listBoxPreviewMouseUpEventHandler );
AddHandler(ListBox.PreviewKeyDownEvent , this.listBoxPreviewKeyDownEventHandler );
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 체크 값 목록 속성 변경시 콜백 처리하기 - checkedValuesPropertyChangedCallback(dependencyObject, e)
/// <summary>
/// 체크 값 목록 속성 변경시 콜백 처리하기
/// </summary>
/// <param name="dependencyObject">의존 객체</param>
/// <param name="e">이벤트 인자</param>
private static void checkedValuesPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
ColumnListBox columnListBox = dependencyObject as ColumnListBox;
if(!columnListBox.setCheckedValuesInternally)
{
string newValue = (e.NewValue == null) ? string.Empty : e.NewValue.ToString();
if(newValue.Contains(UIHelper.INITIALIZE_VALUE))
{
newValue = UIHelper.INITIALIZE_VALUE;
}
columnListBox.SetChecked(newValue);
}
string checkedTexts = columnListBox.GetCheckedTexts();
columnListBox.CheckedTexts = checkedTexts;
IList<ColumnItem> checkedItemList = columnListBox.GetCheckedItemList();
columnListBox.CheckedItemList = checkedItemList;
columnListBox.FireCheckedValuesChanged();
}
#endregion
#region 정렬 순서 표시 여부 속성 변경시 콜백 처리하기 - showSortOrderPropertyChangedCallback(dependencyObject, e)
/// <summary>
/// 정렬 순서 표시 여부 속성 변경시 콜백 처리하기
/// </summary>
/// <param name="dependencyObject">의존 객체</param>
/// <param name="e">이벤트 인자</param>
private static void showSortOrderPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
ColumnListBox columnListBox = dependencyObject as ColumnListBox;
UpdateCheckedValuesInternally(columnListBox);
}
#endregion
#region Priority 표시 여부 속성 변경시 콜백 처리하기 - singleSelectPropertyChangedCallback(dependencyObject, e)
/// <summary>
/// Priority 표시 여부 속성 변경시 콜백 처리하기
/// </summary>
/// <param name="dependencyObject">의존 객체</param>
/// <param name="e">이벤트 인자</param>
private static void singleSelectPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
ColumnListBox columnListBox = dependencyObject as ColumnListBox;
bool newValue = (bool)e.NewValue;
if(newValue)
{
IList<ColumnItem> checkedList = columnListBox.GetCheckedItemList();
if(checkedList.Count > 1)
{
for(int i = 1; i < checkedList.Count; i++)
{
checkedList[i].IsChecked = false;
}
}
}
UpdateCheckedValuesInternally(columnListBox);
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Public
#region 모든 항목 체크하기 - CheckAll()
/// <summary>
/// 모든 항목 체크하기
/// </summary>
public void CheckAll()
{
try
{
RemoveRadioButtonHandler();
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region INIALIZE VALUE 항목을 제외한 모든 소스 항목을 체크한다.
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.Value.Equals(UIHelper.INITIALIZE_VALUE))
{
sourceItem.IsChecked = false;
}
else
{
sourceItem.IsChecked = true;
}
}
#endregion
UpdateCheckedValuesInternally(this);
}
finally
{
AddRadioButtonHandler();
}
}
#endregion
#region 모든 항목 체크 취소하기 - UncheckAll()
/// <summary>
/// 모든 항목 체크 취소하기
/// </summary>
public void UncheckAll()
{
try
{
RemoveRadioButtonHandler();
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 모든 소스 항목을 체크 취소한다.
foreach(ColumnItem sourceItem in sourceCollection)
{
sourceItem.IsChecked = false;
}
#endregion
UpdateCheckedValuesInternally(this);
}
finally
{
AddRadioButtonHandler();
}
}
#endregion
#region 선택 항목 위쪽으로 이동시키기 - MoveTop()
/// <summary>
/// 선택 항목 위쪽으로 이동시키기
/// </summary>
public void MoveTop()
{
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 소스 컬렉션에서 INITIALIZE VALUE 항목을 조사한다.
ColumnItem initializeValueItem = GetInitializeValueItem(sourceCollection);
#endregion
#region 선택 리스트를 설정한다.
IList<ColumnItem> selectedList = GetSelectedList();
if(selectedList == null || selectedList.Count == 0)
{
return;
}
if(initializeValueItem != null)
{
SelectedItems.Remove(initializeValueItem);
selectedList.Remove(initializeValueItem);
}
if(selectedList == null || selectedList.Count == 0)
{
return;
}
#endregion
#region 선택 리스트를 위쪽으로 이동시킨다.
int insertIndex = Math.Max(sourceCollection.IndexOf(selectedList[0]) - 1, (initializeValueItem == null) ? 0 : 1);
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Remove(selectedItem);
}
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Insert(insertIndex++, selectedItem);
SelectedItems.Add(selectedItem);
}
#endregion
UpdateCheckedValuesInternally(this);
}
#endregion
#region 선택 항목 아래쪽으로 이동시키기 - MoveBottom()
/// <summary>
/// 선택 항목 아래쪽으로 이동시키기
/// </summary>
public void MoveBottom()
{
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 소스 컬렉션에서 INITIALIZE VALUE 항목을 조사한다.
ColumnItem initializeValueItem = GetInitializeValueItem(sourceCollection);
#endregion
#region 선택 리스트를 설정한다.
IList<ColumnItem> selectedList = GetSelectedList();
if(selectedList == null || selectedList.Count == 0)
{
return;
}
if(initializeValueItem != null)
{
SelectedItems.Remove(initializeValueItem);
selectedList.Remove(initializeValueItem);
}
if(selectedList == null || selectedList.Count == 0)
{
return;
}
#endregion
#region 선택 리스트를 아래쪽으로 이동시킨다.
int lastSelectedIndex = sourceCollection.IndexOf(selectedList[selectedList.Count - 1]);
if(lastSelectedIndex == sourceCollection.Count - 1)
{
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Remove(selectedItem);
}
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Add(selectedItem);
SelectedItems.Add(selectedItem);
}
}
else
{
int baseIndex = Math.Min(lastSelectedIndex + 1, sourceCollection.Count - 1);
ColumnItem baseItem = sourceCollection[baseIndex];
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Remove(selectedItem);
}
int insertIndex = Math.Min(sourceCollection.IndexOf(baseItem) + 1, sourceCollection.Count - 1);
if(insertIndex == sourceCollection.Count - 1)
{
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Add(selectedItem);
SelectedItems.Add(selectedItem);
}
}
else
{
foreach(ColumnItem selectedItem in selectedList)
{
sourceCollection.Insert(insertIndex++, selectedItem);
SelectedItems.Add(selectedItem);
}
}
}
#endregion
UpdateCheckedValuesInternally(this);
}
#endregion
#region 체크 항목 가장 위쪽으로 이동시키기 - MoveTopMost()
/// <summary>
/// 체크 항목 가장 위쪽으로 이동시키기
/// </summary>
public void MoveTopMost()
{
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 소스 컬렉션에서 INITIALIZE VALUE 항목을 조사한다.
ColumnItem initializeValueItem = GetInitializeValueItem(sourceCollection);
#endregion
#region 리스트 박스의 선택 항목들을 지운다.
SelectedItems.Clear();
#endregion
#region 체크 리스트를 설정한다.
IList<ColumnItem> checkedList = GetCheckedItemList();
if(checkedList == null || checkedList.Count == 0)
{
return;
}
if(initializeValueItem != null)
{
checkedList.Remove(initializeValueItem);
}
if(checkedList == null || checkedList.Count == 0)
{
return;
}
#endregion
#region 소스 컬렉션에서 체크 항목을 제거한다.
foreach(ColumnItem checkedItem in checkedList)
{
sourceCollection.Remove(checkedItem);
}
#endregion
#region 체크 리스트를 가장 위쪽으로 이동시킨다.
int index = initializeValueItem == null ? 0 : 1;
foreach(ColumnItem checkedItem in checkedList)
{
sourceCollection.Insert(index++, checkedItem);
SelectedItems.Add(checkedItem);
}
#endregion
UpdateCheckedValuesInternally(this);
}
#endregion
#region 리소스 해제하기 - Dispose()
/// <summary>
/// 리소스 해제하기
/// </summary>
public void Dispose()
{
RemoveHandler(ListBox.PreviewMouseDownEvent, this.listBoxPreviewMouseDownEventHandler);
RemoveHandler(ListBox.PreviewMouseUpEvent , this.listBoxPreviewMouseUpEventHandler );
RemoveHandler(ListBox.PreviewKeyDownEvent , this.listBoxPreviewKeyDownEventHandler );
this.listBoxPreviewMouseDownEventHandler = null;
this.listBoxPreviewMouseUpEventHandler = null;
this.listBoxPreviewKeyDownEventHandler = null;
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Protected
#region 체크 값 목록 변경시 이벤트 발생시키기 - FireCheckedValuesChanged()
/// <summary>
/// 체크 값 목록 변경시 이벤트 발생시키기
/// </summary>
protected void FireCheckedValuesChanged()
{
if(CheckedValuesChanged != null)
{
CheckedValuesChanged(this, EventArgs.Empty);
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Private
////////////////////////////////////////////////////////////////////// Event
#region 라디오 버튼 체크시 처리하기 - RadioButton_Checked(sender, e)
/// <summary>
/// 라디오 버튼 체크시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
try
{
RemoveRadioButtonHandler();
if(ShowSortOrder)
{
RadioButton radioButton = e.OriginalSource as RadioButton;
if(radioButton != null)
{
#region 라디오 버튼인 경우 처리한다.
string checkedValues = GetCheckedValues();
if(CheckedValues != checkedValues)
{
this.setCheckedValuesInternally= true;
CheckedValues = checkedValues;
this.setCheckedValuesInternally = false;
}
return;
#endregion
}
}
}
finally
{
AddRadioButtonHandler();
}
}
#endregion
#region 리스트 박스 마우스 DOWN 미리보기 처리하기 - ListBox_PreviewMouseDown(sender, e)
/// <summary>
/// 리스트 박스 마우스 DOWN 미리보기 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void ListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if(e.ChangedButton == MouseButton.Left)
{
try
{
RemoveRadioButtonHandler();
#region CTRL 키나 SHIFT 키가 눌렸는지 조사한다.
if(Keyboard.Modifiers == ModifierKeys.Control || Keyboard.Modifiers == ModifierKeys.Shift)
{
return;
}
#endregion
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 라디오 버튼을 클릭했는지 조사한다.
if(e.OriginalSource.GetType() == typeof(RadioButton))
{
return;
}
#endregion
#region 리스트 박스 항목을 설정한다.
HitTestResult hitTestResult = VisualTreeHelper.HitTest(this, e.GetPosition(this));
if(hitTestResult == null)
{
return;
}
ListBoxItem listBoxItem = UIHelper.FindParent<ListBoxItem>(hitTestResult.VisualHit);
if(listBoxItem == null)
{
return;
}
#endregion
#region 드래그 시작 인덱스를 설정한다.
ColumnItem startItem = listBoxItem.Content as ColumnItem;
if(startItem == null)
{
return;
}
this.dragStartIndex = sourceCollection.IndexOf(startItem);
#endregion
}
finally
{
AddRadioButtonHandler();
}
}
}
#endregion
#region 리스트 박스 마우스 UP 미리보기 처리하기 - ListBox_PreviewMouseUp(sender, e)
/// <summary>
/// 리스트 박스 마우스 UP 미리보기 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void ListBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if(e.ChangedButton == MouseButton.Left)
{
try
{
RemoveRadioButtonHandler();
#region CTRL 키나 SHIFT 키가 눌렸는지 조사한다.
if(Keyboard.Modifiers == ModifierKeys.Control || Keyboard.Modifiers == ModifierKeys.Shift)
{
return;
}
#endregion
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 라디오 버튼을 클릭했는지 조사한다.
if(e.OriginalSource.GetType() == typeof(RadioButton))
{
return;
}
#endregion
#region 리스트 박스 항목을 설정한다.
HitTestResult hitTestResult = VisualTreeHelper.HitTest(this, e.GetPosition(this));
if(hitTestResult == null)
{
return;
}
ListBoxItem listBoxItem = UIHelper.FindParent<ListBoxItem>(hitTestResult.VisualHit);
if(listBoxItem == null)
{
return;
}
#endregion
#region 드래그 종료 인덱스를 설정한다.
ColumnItem lastItem = listBoxItem.Content as ColumnItem;
if(lastItem == null)
{
return;
}
this.dragEndIndex = sourceCollection.IndexOf(lastItem);
#endregion
#region 드래그 시작 인덱스와 드래그 종료 인덱스 무결성을 조사한다.
if(this.dragStartIndex == -1 || this.dragEndIndex == -1)
{
return;
}
#endregion
#region 드래그 시작 인덱스와 드래그 종료 인덱스를 조정한다.
if(SingleSelect)
{
this.dragEndIndex = this.dragStartIndex;
}
else
{
if(this.dragStartIndex > this.dragEndIndex)
{
int temporaryIndex = this.dragStartIndex;
this.dragStartIndex = this.dragEndIndex;
this.dragEndIndex = temporaryIndex;
}
}
#endregion
if(SingleSelect)
{
#region 단일 선택인 경우 선택 항목을 체크한다.
ColumnItem startItem = sourceCollection[this.dragStartIndex];
startItem.IsChecked = !startItem.IsChecked;
if(startItem.IsChecked)
{
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.Equals(startItem))
{
continue;
}
sourceItem.IsChecked = false;
}
UpdateCheckedValuesInternally(this);
}
#endregion
}
else
{
#region 멀티 선택인 경우 선택 항목을 체크한다.
if (this.dragStartIndex > 0)
{
if(sourceCollection[0].Value.Equals(UIHelper.INITIALIZE_VALUE) && sourceCollection[0].IsChecked)
{
sourceCollection[0].IsChecked = false;
}
}
List<ColumnItem> selectedList = new List<ColumnItem>();
for(int i = this.dragStartIndex; i < this.dragEndIndex + 1; i++)
{
ColumnItem sourceItem = sourceCollection[i];
sourceItem.IsChecked = !sourceItem.IsChecked;
if(sourceItem.IsChecked)
{
selectedList.Add(sourceItem);
}
}
string values = GetCheckedValues();
if(values.Contains(UIHelper.INITIALIZE_VALUE))
{
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.Value.Equals(UIHelper.INITIALIZE_VALUE))
{
continue;
}
sourceItem.IsChecked = false;
selectedList.Remove(sourceItem);
}
}
SelectedItems.Clear();
foreach(ColumnItem selectedItem in selectedList)
{
SelectedItems.Add(selectedItem);
}
UpdateCheckedValuesInternally(this);
#endregion
}
}
finally
{
AddRadioButtonHandler();
}
}
}
#endregion
#region 리스트 박스 키 DOWN 미리보기 처리하기 - ListBox_PreviewKeyDown(sender, e)
/// <summary>
/// 리스트 박스 키 DOWN 미리보기 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void ListBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Space)
{
if(SelectedItem != null)
{
ColumnItem selectedItem = SelectedItem as ColumnItem;
if(selectedItem != null)
{
selectedItem.IsChecked = !selectedItem.IsChecked;
}
e.Handled = true;
}
}
}
#endregion
////////////////////////////////////////////////////////////////////// Event
#region 체크 설정하기 - SetChecked(checkedValues)
/// <summary>
/// 체크 설정하기
/// </summary>
/// <param name="checkedValues">체크 값 목록</param>
private void SetChecked(string checkedValues)
{
try
{
RemoveRadioButtonHandler();
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return;
}
#endregion
#region 모든 소스 항목을 체크 취소한다.
foreach(ColumnItem sourceItem in sourceCollection)
{
sourceItem.IsChecked = false;
}
#endregion
#region 체크 값 목록이 없는 경우를 조사한다.
if(string.IsNullOrEmpty(checkedValues))
{
return;
}
#endregion
string[] checkedValueArray = checkedValues.Split(',');
int checkedValueArrayCount = checkedValueArray.Length;
int checkedValueCount = 0;
for(int i = checkedValueArrayCount - 1; i > -1; i--)
{
string[] checkedValueElementArray = checkedValueArray[i].Split(' ');
for(int j = 0; j < sourceCollection.Count; j++)
{
ColumnItem sourceItem = sourceCollection[j];
if(sourceItem.Value.Equals(checkedValueElementArray[0].Trim()))
{
sourceItem.IsChecked = true;
checkedValueCount++;
if(ShowSortOrder && checkedValueElementArray.Length > 1)
{
sourceItem.IsDescending = (checkedValueElementArray[1] == "DESC") ? true : false;
}
if(!this.setCheckedValuesInternally)
{
if(!sourceItem.Value.Equals(UIHelper.INITIALIZE_VALUE))
{
sourceCollection.Remove(sourceItem);
sourceCollection.Insert(1, sourceItem);
}
}
break;
}
}
}
if(checkedValueCount == 0)
{
if(sourceCollection != null && sourceCollection.Count > 0)
{
sourceCollection[0].IsChecked = true;
}
}
}
finally
{
this.setCheckedValuesInternally = false;
AddRadioButtonHandler();
}
}
#endregion
#region 체크 값 목록 구하기 - GetCheckedValues()
/// <summary>
/// 체크 값 목록 구하기
/// </summary>
/// <returns>체크 값 목록</returns>
private string GetCheckedValues()
{
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return string.Empty;
}
#endregion
StringBuilder stringBuilder = new StringBuilder();
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.IsChecked)
{
if(ShowSortOrder)
{
if(sourceItem.Value.Equals(UIHelper.INITIALIZE_VALUE))
{
stringBuilder.AppendFormat("{0},", sourceItem.Value);
}
else
{
stringBuilder.AppendFormat("{0} {1},", sourceItem.Value, sourceItem.IsDescending ? "DESC" : "ASC");
}
}
else
{
stringBuilder.AppendFormat("{0},", sourceItem.Value);
}
if(SingleSelect)
{
break;
}
}
}
return stringBuilder.ToString().Trim().TrimEnd(',');
}
#endregion
#region 체크 텍스트 목록 구하기 - GetCheckedTexts()
/// <summary>
/// 체크 텍스트 목록 구하기
/// </summary>
/// <returns>체크 텍스트 목록</returns>
private string GetCheckedTexts()
{
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return string.Empty;
}
#endregion
StringBuilder stringBuilder = new StringBuilder();
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.IsChecked)
{
if(ShowSortOrder)
{
if(sourceItem.Value.Equals(UIHelper.INITIALIZE_VALUE))
{
stringBuilder.AppendFormat("{0},", sourceItem.Text);
}
else
{
stringBuilder.AppendFormat("{0} {1},", sourceItem.Text, sourceItem.IsDescending ? "DESC" : "ASC");
}
}
else
{
stringBuilder.AppendFormat("{0},", sourceItem.Text);
}
}
}
return stringBuilder.ToString().Trim().TrimEnd(',');
}
#endregion
#region 체크 항목 리스트 구하기 - GetCheckedItemList()
/// <summary>
/// 체크 항목 리스트 구하기
/// </summary>
/// <returns>체크 항목 리스트</returns>
private IList<ColumnItem> GetCheckedItemList()
{
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
IList<ColumnItem> checkedList = new List<ColumnItem>();
if(sourceCollection == null || sourceCollection.Count == 0)
{
return checkedList;
}
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.IsChecked)
{
checkedList.Add(sourceItem);
}
}
return checkedList;
}
#endregion
#region 내부적으로 체크 값 목록 갱신하기 - UpdateCheckedValuesInternally
/// <summary>
/// 내부적으로 체크 값 목록 갱신하기
/// </summary>
/// <param name="checkedListBox">체크 리스 박스</param>
private static void UpdateCheckedValuesInternally(ColumnListBox checkedListBox)
{
string checkedValues = checkedListBox.GetCheckedValues();
if(checkedListBox.CheckedValues != checkedValues)
{
checkedListBox.setCheckedValuesInternally = true;
checkedListBox.CheckedValues = checkedValues;
checkedListBox.setCheckedValuesInternally = false;
}
}
#endregion
#region INITIALIZE VALUE 항목 구하기 - GetInitializeValueItem(sourceCollection)
/// <summary>
/// INITIALIZE VALUE 항목 구하기
/// </summary>
/// <param name="sourceCollection">소스 컬렉션</param>
/// <returns>INITIALIZE VALUE 항목</returns>
private ColumnItem GetInitializeValueItem(ObservableCollection<ColumnItem> sourceCollection)
{
ColumnItem initializeValueItem = null;
foreach(ColumnItem sourceItem in sourceCollection)
{
if(sourceItem.Value.Equals(UIHelper.INITIALIZE_VALUE))
{
initializeValueItem = sourceItem;
break;
}
}
return initializeValueItem;
}
#endregion
#region 선택 리스트 구하기 - GetSelectedList()
/// <summary>
/// 선택 리스트 구하기
/// </summary>
/// <returns>선택 리스트</returns>
private IList<ColumnItem> GetSelectedList()
{
#region 소스 컬렉션을 설정한다.
ObservableCollection<ColumnItem> sourceCollection = ItemsSource as ObservableCollection<ColumnItem>;
if(sourceCollection == null || sourceCollection.Count == 0)
{
return null;
}
#endregion
#region 리스트 박스의 선택 항목들을 조사한다.
if(SelectedItems == null || SelectedItems.Count == 0)
{
return null;
}
#endregion
#region 선택 정렬 리스트를 설정한다.
SortedList<int, ColumnItem> selectedSortedList = new SortedList<int, ColumnItem>();
foreach(ColumnItem selectedItem in SelectedItems)
{
int index = sourceCollection.IndexOf(selectedItem);
selectedSortedList.Add(index, selectedItem);
}
if(selectedSortedList.Count == 0)
{
return null;
}
#endregion
#region 선택 리스트를 설정한다.
List<ColumnItem> selectedList = new List<ColumnItem>();
for(int i = 0; i < selectedSortedList.Count; i++)
{
selectedList.Add(selectedSortedList[selectedSortedList.Keys[i]]);
}
#endregion
return selectedList;
}
#endregion
#region 라디오 버튼 핸들러 추가하기 - AddRadioButtonHandler()
/// <summary>
/// 라디오 버튼 핸들러 추가하기
/// </summary>
private void AddRadioButtonHandler()
{
AddHandler(RadioButton.CheckedEvent , this.radioButtonCheckedEventHandler);
AddHandler(RadioButton.UncheckedEvent, this.radioButtonCheckedEventHandler);
}
#endregion
#region 라디오 버튼 핸들러 제거하기 - RemoveRadioButtonHandler()
/// <summary>
/// 라디오 버튼 핸들러 제거하기
/// </summary>
private void RemoveRadioButtonHandler()
{
RemoveHandler(RadioButton.CheckedEvent , this.radioButtonCheckedEventHandler);
RemoveHandler(RadioButton.UncheckedEvent, this.radioButtonCheckedEventHandler);
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] ObservableCollection<T> 클래스 : 바인딩 설정하기 (0) | 2017.06.11 |
---|---|
[C#/WPF] TreeViewItem 클래스 : ItemsSource 속성을 사용해 트리 뷰 만들기 (0) | 2017.06.11 |
[C#/WPF] NavigationWindow 엘리먼트 : 페이지 탐색하기 (0) | 2017.06.11 |
[C#/WPF] XAML용 UI 디버깅 도구 숨기기 (0) | 2017.05.30 |
[C#/WPF] ControlTemplate 엘리먼트 : 조직도 TreeViewItem 엘리먼트 정의하기 (0) | 2017.05.25 |
[C#/WPF] ItemsControl 클래스 : 리스트 컨트롤 사용하기 (0) | 2017.04.07 |
[C#/WPF] Button 클래스 : 이미지 버튼 사용하기 (0) | 2017.04.02 |
[C#/WPF] GroupBox 클래스 : 그룹 컨트롤 사용하기 (0) | 2017.04.01 |
[C#/WPF] ContentControl 클래스 : 확장/축소 패널 사용하기 (0) | 2017.04.01 |
[C#/WPF] Button 클래스 : 모노 버튼 사용하기 (0) | 2017.04.01 |
댓글을 달아 주세요