--- lang: ja-jp breaks: true --- # WPF Comboboxにenumをバインドして選択値を取得・変更する 2022-08-01 :::info WinUI 3で同じことをやってみたがうまくいかないので、WPFでも試してみる。 ※正常に動作する。。。 ::: ![](https://i.imgur.com/l0kPQIM.png) ## MainWindow.xaml ```xaml= <Window x:Class="WpfApp1.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.DataContext> <local:MainWindowModelView /> </Window.DataContext> <Grid> <StackPanel> <ComboBox ItemsSource="{Binding Path=EnumSamples}" SelectedValue="{Binding Path=EnumSample}" /> <Button x:Name="getValueButton" Click="getValueButton_Click">値の取得</Button> <TextBlock x:Name="viewValueTextBlock"></TextBlock> <Button x:Name="changeValueButton" Click="changeValueButton_Click">値の変更</Button> </StackPanel> </Grid> </Window> ``` ## MainWindow.xaml.cs ```csharp= namespace WpfApp1; /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { MainWindowModelView viewModel; public MainWindow() { InitializeComponent(); viewModel = (MainWindowModelView)DataContext; } private void getValueButton_Click(object sender, RoutedEventArgs e) { viewValueTextBlock.Text = viewModel.EnumSample?.ToString(); } private void changeValueButton_Click(object sender, RoutedEventArgs e) { viewModel.EnumSample = EnumSamples.EEE; } } ``` ## MainWindowModelView.cs ```csharp= namespace WpfApp1; public enum EnumSamples { AAA, BBB, CCC, DDD, EEE } public class MainWindowModelView: INotifyPropertyChanged { public IEnumerable<EnumSamples> EnumSamples { get { return Enum.GetValues<EnumSamples>(); } } private EnumSamples? m_enumSample; public EnumSamples? EnumSample { get { return this.m_enumSample; } set { if (value == this.m_enumSample) { return; } this.m_enumSample = value; OnPropertyChanged(nameof(EnumSample)); } } public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged_EnumSample; private void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); switch (propertyName) { case nameof(EnumSample): PropertyChanged_EnumSample?.Invoke(this, new PropertyChangedEventArgs(propertyName)); break; } } } ``` ###### tags: `WPF` `Combobox` `enum` `Bind`