본문 바로가기

Dev::DotNet/WPF

WPF Filter ComboBox


ComboBox 컨트롤을 사용하면 

사용자가 입력하는 문자열에 따라서 아이템이 Filter 되서 나오는 것이 편할 때가 있고
손쉽게 Filter 가 되게 구현할 수 있다.


하지만 ComboBox 를 Edit 를 하다보면 한글에 대해서 입력한 값이 


Text 프로퍼티에 바로바로 들어가지 않는 것을 알 수 있다.



예상으로는 아마도 ComboBox 에서 한글 입력에 대해서 음절(or 어절)이 끝나지 않았다고 판단하는 것 같고 

그래서 Text 프로퍼티에 해당 값을 넣어주지 않는 듯하다.


[XAML]

<Window x:Class="WpfApplication2.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" SizeToContent="Height"

        Loaded="Window_Loaded">

    <Grid>

        <ComboBox x:Name="ComboBoxCtrl"

                  IsEditable="True"

                  IsTextSearchEnabled="True"

                  KeyUp="ComboBoxCtrl_KeyUp">

            <ComboBoxItem>테스트1Item</ComboBoxItem>

            <ComboBoxItem>테스트2Item</ComboBoxItem>

            <ComboBoxItem>테스트3Item</ComboBoxItem>

        </ComboBox>

    </Grid>

</Window>


[CODE]

using System.Windows;

using System.Windows.Controls;

using System.Windows.Input;

 

namespace WpfApplication2

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        private TextBox mTxtBox = null;

 

        public MainWindow()

        {

            InitializeComponent();         

        }

 

        private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            // 한글의 원할한 검색을 위해서 ComboBox Editable TextBox 를 가져온다.

            this.mTxtBox = ComboBoxCtrl.Template.FindName("PART_EditableTextBox", ComboBoxCtrl) as TextBox;

        }

 

        private void ComboBoxCtrl_KeyUp(object sender, KeyEventArgs e)

        {

            ComboBoxCtrl.Items.Filter -= this.FilterPredicate;

 

            if ((e.Key == Key.Enter) || (e.Key == Key.Tab) || (e.Key == Key.Return))

            {

                //ComboBoxCtrl.Items.Filter = null;

    return;

            }

            else

            {

                ComboBoxCtrl.IsDropDownOpen = true;

                ComboBoxCtrl.Items.Filter += this.FilterPredicate;

            }

        }

 

        private bool FilterPredicate(object obj)

        {

            string sValue = string.Empty;

 

            if (obj is string)

                sValue = obj.ToString();

            else if (obj is ComboBoxItem)

                sValue = (obj as ComboBoxItem).Content.ToString();

            else

            {

                System.Reflection.PropertyInfo info = obj.GetType().GetProperty(ComboBoxCtrl.DisplayMemberPath);

                if (info != null)

                {

                    object oValue = info.GetValue(obj, null);

                    if (oValue != null)

                        sValue = oValue.ToString();

                }

            }

 

            if (!string.IsNullOrEmpty(sValue) && sValue.Contains(this.mTxtBox.Text))

                return true;

            else

                return false;

        }

                 

    }

}

 

그래서 차선으로 ComboBox 의 Template 에서 입력 컨트롤인 "PART_EditableTextBox" 를 가져와서 

입력된 문자열을 바로 접근하였다.


한글에 대해서 좀 더 손쉬운 방법이 있지 않을까 하는 생각으로 찾고 있지만...