๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/Windows WPF

[WPF] WPF ComboBox์—์„œ ํŠน์ • Enum ํ•ญ๋ชฉ์—๋งŒ ํˆดํŒ ๋ณด์—ฌ์ฃผ๊ธฐ

by HanaV 2025. 4. 9.
728x90

WPF์—์„œ ComboBox๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, Enum ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ํ”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์„ค์ • ํ™”๋ฉด์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด, ComboBox์˜ ์•„์ดํ…œ ์ค‘ ํŠน์ • ํ•ญ๋ชฉ์—๋งŒ ํˆดํŒ์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


์‹œ๋‚˜๋ฆฌ์˜ค

  • ์‚ฌ์šฉ์ž๋Š” LAN, WiFi, VPN ์ค‘ ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ์ค‘ VPN์€ ๋ณด์•ˆ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ํˆดํŒ์„ ํ†ตํ•ด ์ด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•ญ๋ชฉ์—๋Š” ํˆดํŒ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. VPN ํ•ญ๋ชฉ์— ๋งˆ์šฐ์Šค๊ฐ€ ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ๋งŒ ํˆดํŒ์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1. Enum ์ •์˜

๋จผ์ € ์—ฐ๊ฒฐ ๋ฐฉ์‹์— ๋Œ€ํ•œ Enum์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

public enum ConnectionType
{
    LAN,
    WiFi,
    VPN
}

2. ํˆดํŒ ์ปจ๋ฒ„ํ„ฐ ๊ตฌํ˜„

ํˆดํŒ์„ ์กฐ๊ฑด๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” IValueConverter๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
VPN์ผ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” null์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํˆดํŒ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

public class ConnectionTooltipConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is ConnectionType type)
        {
            return type == ConnectionType.VPN ? "๋ณด์•ˆ ์—ฐ๊ฒฐ ํ•„์š”" : null;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => throw new NotImplementedException();

    public override object ProvideValue(IServiceProvider serviceProvider)
        => this;
}

์ด ์ปจ๋ฒ„ํ„ฐ๋Š” XAML์—์„œ๋„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก MarkupExtension์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


3. XAML์—์„œ ComboBox ๊ตฌ์„ฑ

ComboBox์— Enum์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค ํˆดํŒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ItemContainerStyle์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<ComboBox Height="20" Width="100" ItemsSource="{Binding ConnectionTypes, ElementName=wTest}" SelectedIndex="0">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="ToolTip" Value="{Binding Path=Content, RelativeSource={RelativeSource Self}, Converter={local:ConnectionTooltipConverter}}"/>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

์—ฌ๊ธฐ์„œ ConnectionTypes๋Š” ConnectionType Enum์˜ ๊ฐ’๋“ค์„ ๋ฐ”์ธ๋”ฉํ•œ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค.
์ €๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋ผ DependencyProperty๋กœ ์œˆ๋„์šฐ ๋‚ด๋ถ€์— ์„ ์–ธํ•˜์˜€์ง€๋งŒ,
๋ณธ์ธ ์ƒํ™ฉ์— ๋”ฐ๋ผ ObjectDataProvider๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ทฐ๋ชจ๋ธ์—์„œ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

public IEnumerable<ConnectionType> ConnectionTypes
{
    get { return (IEnumerable<ConnectionType>)GetValue(ConnectionTypeProperty); }
    set { SetValue(ConnectionTypeProperty, value); }
}
public static readonly DependencyProperty ConnectionTypeProperty =
    DependencyProperty.Register(nameof(ConnectionTypes), typeof(IEnumerable<ConnectionType>), typeof(TestDialog), new PropertyMetadata(null));

public TestDialog(WindowPosition windowPosition)
{
    windowPosition.Apply(this);

    InitializeComponent();

    ConnectionTypes = Enum.GetValues(typeof(ConnectionType)).Cast<ConnectionType>();
}

๋˜ํ•œ, DevExpress๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” dxe:EnumItemsSource๋ฅผ ํ™œ์šฉํ•˜์—ฌ Enum์„ ๋ฐ”๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


4. ์ •๋ฆฌ

  • ItemContainerStyle์„ ์‚ฌ์šฉํ•˜๋ฉด ComboBox์˜ ํ•ญ๋ชฉ๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์ธ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ValueConverter๋ฅผ ํ†ตํ•ด ํŠน์ • ํ•ญ๋ชฉ์—๋งŒ ์กฐ๊ฑด๋ถ€๋กœ ํˆดํŒ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์„ ํ™•์žฅํ•ด์„œ Tooltip ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90

"); wcs_do();