<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 Like
정보가 부족합니다. [콤보박스 ItemsSource 바인딩인 Enums가 어떤 데이터인지도 없고]
코드도 보기 어렵습니다.
오류 내용도 없구요 (바인딩 관련 오류라면 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 Likes
부족한 정보 죄송합니다! 단순히 enum타입 맞고 오류를 띄우지는 않는데 원하는 결과값을 도출하지 않았습니다! 답변해주신 내용으로 적용해보겠습니다
1 Like
dimohy
February 9, 2023, 6:38am
4
안되는 상황을 좀 더 정확히 설명해줄 수 있을까요?
(참고로 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일 경우,
:이외의 값일 경우
2 Likes
친절한 답변 감사드립니다!! 정확하게 진단하셨습니다
1 Like
dimohy
February 9, 2023, 6:55am
6
답변자 뿐만 아니라 질문자도 질문 문제의 정확한 원인이 무엇이었고 어떻게 해결 하였는가 를 댓글로 남겨주시면 커뮤니티에 기여하게 됩니다. 단순한 질문글에서 유사한 문제를 가진 분들에게 도움이 되는 컨텐츠가 되게 되는데요. 원하는 동작성을 확인하시면 관련 댓글 부탁을 드리겠습니다.
4 Likes
@redstone 님 유형의 질문들은 앞으로 GitHub를 통해 문제를 공유해주시면 엄청 좋으실 것 같습니다.
그럼 답변해주시는 분들 퀄리티도 더 달라질겁니다.
그렇게 되면 더 깊이 있게 이해하고 학습할 수 있으실 것으로 기대 됩니다!
(엄청 열심히 하시는 것 같아 조언 드렸습니다!)
1 Like
사실 답변하시기들전에 이미 문제를 해결했는데요
저는 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 Likes