質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2275閲覧

C# WPF コンボボックスのSelectedItemをEnumにバインドさせる方法

Hottopia

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2023/06/14 04:42

前提

C#(WPF Prism使用)に関して
コンボボックスのItemsSourceにDictionary<SampleEnum, string> をバインドしています。コンボボックスに表示されるのはバリューのstringの方です。
ViewModelに、コンボボックスの現在選択されている要素を格納するプロパティSelectedを作成しました。

コンボボックスのSelectedValuePath="Key" に設定されているので、Selectedには、DictionaryのKeyであるSampleEnumがバインドされ、格納される想定でしたが、うまくバインドされていないようで、解決したく質問しました。

実現したいこと

MainWindowViewModelのSelectedプロパティに、SampleEnumがバインドされるようにしたい、

発生している問題・エラーメッセージ

デバッグ時、コンボボックスの選択要素を変更するとXamlバインドエラーが発生する。

Cannot convert '[SampleA, サンプルA]' from type 'KeyValuePair`2' to type 'ComboboxSample.SampleEnum' for 'en-US' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: EnumConverter cannot convert from System.Collections.Generic.KeyValuePair`2[[ComboboxSample.SampleEnum, ComboboxSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].

該当のソースコード

MainWindow.xaml

Xalm

1<Window x:Class="ComboboxSample.Views.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 xmlns:viewmodels="clr-namespace:ComboboxSample.ViewModels" 6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 7 d:DataContext="{d:DesignInstance Type=viewmodels:MainWindowViewModel, IsDesignTimeCreatable=True}" 8 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 9 mc:Ignorable="d" 10 prism:ViewModelLocator.AutoWireViewModel="True" 11 Title="{Binding Title}" Height="350" Width="525" > 12 <Grid> 13 <ContentControl prism:RegionManager.RegionName="ContentRegion" /> 14 <ComboBox Height="20" Width="100" 15 ItemsSource="{Binding SampleEnums}" 16 SelectedValuePath="Key" 17 DisplayMemberPath="Value" 18 SelectedItem="{Binding Selected}" 19 SelectedIndex="0"/> 20 </Grid> 21</Window>

MainWindowViewModel.cs

C#

1using Prism.Mvvm; 2using System.Collections.Generic; 3 4namespace ComboboxSample.ViewModels 5{ 6 public class MainWindowViewModel : BindableBase 7 { 8 public SampleEnum Selected{ get; set; } 9 public Dictionary<SampleEnum, string> SampleEnums { get; set; } 10 public MainWindowViewModel() 11 { 12 SampleEnums = new Dictionary<SampleEnum, string>() 13 { 14 {SampleEnum.SampleA, "サンプルA" }, 15 { SampleEnum.SampleB, "サンプルB" }, 16 { SampleEnum.SampleC, "サンプルC" } 17 }; 18 } 19 } 20}

SampleEnum.cs

C#

1namespace ComboboxSample 2{ 3 public enum SampleEnum 4 { 5 SampleA, 6 SampleB, 7 SampleC 8 } 9}

補足情報(FW/ツールのバージョンなど)

C#10.0
.NET6.0
WPF
Prism.Unity8.1.97
Visual Studio2022

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

xamlの方で、バインディングターゲットにSelectedItemを使用していた部分を、SelectedValueに変更したところ、想定していた動作になりました。

Before
<ComboBox Height="20" Width="100"
ItemsSource="{Binding SampleEnums}"
SelectedValuePath="Key"
DisplayMemberPath="Value"
SelectedValue="{Binding Selected}"
SelectedIndex="0"/>

After
<ComboBox Height="20" Width="100"
ItemsSource="{Binding SampleEnums}"
SelectedValuePath="Key"
DisplayMemberPath="Value"
SelectedItem="{Binding Selected}"
SelectedIndex="0"/>

投稿2023/06/14 05:59

Hottopia

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問