wpf combobox selected value 가져오는방법?

<telerik:RadComboBox x:Name="cmbSelect" Width="225" HorizontalContentAlignment="Center" Height="40" SelectedIndex="0" ItemsSource="{Binding Enums}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}">

속성에 selecteditem이 있어서 twoway로 바인딩해서 가져다 쓰면 되겠따 싶었는데
값이 안가져와지더라구요

viewmodel

private string _selectedItem = string.Empty;
        public string SelectedItem
        {
            get => _selectedItem;
            set => SetProperty(ref _selectedItem, value);
        }

public viewmodel()
{
 if (this._selectedItem == "NV")
            {
                Visibility = Visibility.Collapsed;
            }
            else
            {
                Visibility = Visibility.Visible;
            }

}

참고로 VISIBILITY역시 BINDING 되어있는 상태입니다. 어떤식으로 값을 가져올수있나요?
콤보박스의 값에 따라 특정영역을 숨기거나 나타내고싶습니다.

1개의 좋아요
  1. 정보가 부족합니다. [콤보박스 ItemsSource 바인딩인 Enums가 어떤 데이터인지도 없고]
  2. 코드도 보기 어렵습니다.
  3. 오류 내용도 없구요 (바인딩 관련 오류라면 VS에서 바인딩 오류를 보실 수 있습니다.)

단순히 그냥 enum타입이라고 추측하고 이렇게 해보시면 잘 되는걸 볼 수 있습니다.

public enum ETest
{
            A,
            B,
            C,
}

public Array EnumArr { get => Enum.GetValues(typeof(ETest)); }
public String SelectedEnum { get; set; }
<ComboBox ItemsSource="{Binding EnumArr}"
                  SelectedItem="{Binding SelectedEnum}"/>
2개의 좋아요

부족한 정보 죄송합니다! 단순히 enum타입 맞고 오류를 띄우지는 않는데 원하는 결과값을 도출하지 않았습니다! 답변해주신 내용으로 적용해보겠습니다

1개의 좋아요

안되는 상황을 좀 더 정확히 설명해줄 수 있을까요?

(참고로 ViewModel에 View의 종속성이 생겨서는 안됩니다. Visibility의 경우 뷰에 종속성이 있으므로 컨버터를 구현하거나 저처럼 트리거를 이용하는 방법이 있습니다.)


다음의 코드로 동작을 확인해 볼 수 있습니다.

| MainWindow.xaml

<Window
    x:Class="WpfApp31.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp31"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <StackPanel Orientation="Vertical">
        <ComboBox ItemsSource="{Binding Enums}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
        <Border
            Width="150"
            Height="150"
            Background="Green">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsShow}" Value="False">
                            <Setter Property="Visibility" Value="Hidden" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
        <TextBlock Text="{Binding SelectedItem}" HorizontalAlignment="Center"/>
    </StackPanel>
</Window>

| MainWindow.xaml.cs (테스트를 위해 ViewModel 없이 View에서 INotifyPropertyChanged를 구현)

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;


namespace WpfApp31
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler? PropertyChanged;

        private string _selectedItem = string.Empty;
        private bool _isShow = false;

        public string SelectedItem
        {
            get => _selectedItem;
            set
            {
                if (_selectedItem == value)
                    return;

                _selectedItem = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItem)));

                if (SelectedItem is "NV")
                    IsShow = false;
                else
                    IsShow = true;
            }
        }

        public bool IsShow
        {
            get => _isShow;
            set
            {
                if (_isShow == value)
                    return;

                _isShow = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsShow)));
            }
        }

        public IEnumerable<string> Enums { get; } = new[] { "NV", "1", "2", "3 " };

        public MainWindow()
        {
            DataContext = this;

            InitializeComponent();

            SelectedItem = "NV";
        }

    }
}

| 동작 화면
: SelectedItem이 NV일 경우,
image

:이외의 값일 경우
image

image

image

2개의 좋아요

친절한 답변 감사드립니다!! 정확하게 진단하셨습니다

1개의 좋아요

답변자 뿐만 아니라 질문자도 질문 문제의 정확한 원인이 무엇이었고 어떻게 해결 하였는가를 댓글로 남겨주시면 커뮤니티에 기여하게 됩니다. 단순한 질문글에서 유사한 문제를 가진 분들에게 도움이 되는 컨텐츠가 되게 되는데요. 원하는 동작성을 확인하시면 관련 댓글 부탁을 드리겠습니다.

4개의 좋아요

@redstone 님 유형의 질문들은 앞으로 GitHub를 통해 문제를 공유해주시면 엄청 좋으실 것 같습니다. :smile:

그럼 답변해주시는 분들 퀄리티도 더 달라질겁니다.
그렇게 되면 더 깊이 있게 이해하고 학습할 수 있으실 것으로 기대 됩니다!

(엄청 열심히 하시는 것 같아 조언 드렸습니다!)

1개의 좋아요

사실 답변하시기들전에 이미 문제를 해결했는데요

저는 selectionchangedeventargs를 통하여 해결했습니다.

.xaml

<telerik:RadComboBox x:Name="cmbSelect" Width="225" HorizontalContentAlignment="Center" Height="40" SelectedIndex="0" ItemsSource="{Binding EnumStrings}">
                        <b:Interaction.Triggers>
                            <b:EventTrigger EventName="SelectionChanged">
                                <b:InvokeCommandAction Command="{Binding SetCommand}" PassEventArgsToCommand="True" />
                            </b:EventTrigger>
                        </b:Interaction.Triggers>
                    </telerik:RadComboBox>

                </StackPanel>

                <StackPanel Orientation="Horizontal" Margin="10,10,10,10" Visibility="{Binding Visibility}">

뷰모델

private void OnSelectionChanged(object obj)
        {    
            SelectionChangedEventArgs args = obj as SelectionChangedEventArgs;
            if (args == null)
            {
                return;
            }

            object selectedItem = args.AddedItems[0];
            if (selectedItem.ToString() == "a")
            {
                this.Visibility = Visibility.Collapsed;
            }
            else
            {
                this.Visibility = Visibility.Visible;
            }
        }

        #endregion Private Methods

        #region Public Properties

        private Visibility _visibility = Visibility.Collapsed;
        public Visibility Visibility
        {
            get => _visibility;
            private set => SetProperty(ref _visibility, value);
        }
this.SetCommand = new RelayCommand<object>(OnSelectionChanged);

최초의 상태가 무조건 invisible한 상태라 그냥 초기값을 invisible로 줬어요!

2개의 좋아요

이부분 적극 반영해보겠습니다!

2개의 좋아요