첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ 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
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요