--- lang: ja-jp breaks: true --- # WinUI 3 Comboboxにenum型の値をバインドしたところ、プロパティに値をセットしても画面にうまく反映されない 2022-08-01  :::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`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up