---
# System prepended metadata

title: WinUI 3 Comboboxにenum型の値をバインドしたところ、プロパティに値をセットしても画面にうまく反映されない 2022-08-01
tags: [WinUI 3, enum, Combobox]

---

---
lang: ja-jp
breaks: true
---
# WinUI 3 Comboboxにenum型の値をバインドしたところ、プロパティに値をセットしても画面にうまく反映されない 2022-08-01

![](https://i.imgur.com/7RYSO4N.png)

:::warning
以下のコードは正常に動作しない。原因不明。。。
※WPFでは正常に動作する。
:::

:::info
2022-08-02 解決
バインドするプロパティを`SelectedValue`から`SelectedItem`に変更すると正常に動作した。
:::

## MainWindow.xaml

```xaml=
<Window
    x:Class="App2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid x:Name="m_grid"
        Background="{ThemeResource AcrylicBackgroundFillColorDefaultBrush}"
        >
        <Grid.DataContext>
            <local:MainWindowViewModel />
        </Grid.DataContext>
        
        <StackPanel 
            Orientation="Vertical" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center"
            >
            <ComboBox 
                ItemsSource="{Binding Path=EnumSamples}" 
                SelectedValue="{Binding Path=EnumSample, Mode=TwoWay}"
                ></ComboBox>
            <Button x:Name="getValueButton" Click="getValueButton_Click">値の取得</Button>
            <TextBlock x:Name="viewValueTextBlock" Height="100"></TextBlock>
            <Button x:Name="changeValueButton" Click="changeValueButton_Click">値の変更</Button>
        </StackPanel>
    </Grid>
</Window>
```

## MainWindow.xaml.cs

```csharp=
namespace App2
{
    /// <summary>
    /// An empty window that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainWindow : Window
    {
        MainWindowViewModel viewModel;

        public MainWindow()
        {
            this.InitializeComponent();

            viewModel = (MainWindowViewModel)m_grid.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;
        }
    }
}
```

## MainWindowViewModel.cs

```csharp=
namespace App2;

public enum EnumSamples
{
    AAA,
    BBB,
    CCC,
    DDD,
    EEE
}

public sealed class MainWindowViewModel:
    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;
        }
    }
}
```

## github issue

> Combobox SelectedValue property not working #4035
> https://github.com/microsoft/microsoft-ui-xaml/issues/4035

## 解決①

バインドするプロパティを`SelectedValue`から`SelectedItem`に変更すると正常に動作した。

```xaml=
                SelectedValue="{Binding Path=EnumSample, Mode=TwoWay}"
```

↓

```xaml=
                SelectedItem="{Binding Path=EnumSample, Mode=TwoWay}"
```

## 解決②

以下は、正常に動作する。
```csharp=
Enum.GetValues<EnumSamples>();
```

以下は、正常に動作しない。
```csharp=
FastEnumUtility.FastEnum.GetValues<EnumSamples>();
```

ただし、以下のようにすれば動作する。
```csharp=
FastEnumUtility.FastEnum.GetValues<EnumSamples>().ToArray();
```


###### tags: `WinUI 3` `Combobox` `enum`
