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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

Q&A

解決済

2回答

10300閲覧

DataGridComboBoxColumnのBinding方法がわかりません

cpthgli

総合スコア76

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

0グッド

0クリップ

投稿2019/03/18 02:04

編集2019/03/18 04:47

前提・実現したいこと

WPFのDataGridComboBoxColumnでのBingingが色々と調べましたが理解できません。

実現したい機能は以下のとおりです。

  • enum Categoryより値を選択できる
  • 表示テキストはDictionary<Category, string> CategoryNameから表示
  • 項目ごとに異なった初期値が設定されている

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

  • enum Categoryが表示されるが値が決定できない
  • 初期値が設定されていない

該当のソースコード

XAML

1 <DataGrid x:Name="DataGrid" AutoGenerateColumns="False"> 2 <DataGrid.Columns> 3 <DataGridTextColumn IsReadOnly="True" Binding="{Binding ItemName}" /> 4 <DataGridComboBoxColumn x:Name="CategoryColumn" 5 DisplayMemberPath="Name" 6 SelectedValuePath="Category" /> 7 </DataGrid.Columns> 8 </DataGrid>

C#

1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 this.InitializeComponent(); 6 } 7 8 public enum Category 9 { 10 Category1, 11 Category2, 12 Category3, 13 } 14 15 public static readonly Dictionary<Category, string> CategoryName = new Dictionary<Category, string> 16 { 17 { Category.Category1, "カテゴリ1" }, 18 { Category.Category2, "カテゴリ2" }, 19 { Category.Category3, "カテゴリ3" }, 20 }; 21 22 public struct Data 23 { 24 public string ItemName { get; set; } 25 } 26 27 public struct CategoryData 28 { 29 public string Name => MainWindow.CategoryName[this.Category]; 30 public Category Category { get; set; } 31 } 32 33 private List<Data> Source = new List<Data>(); 34 private List<CategoryData> ColumnsSource = new List<CategoryData>(); 35 36 private void Window_Loaded(object sender, RoutedEventArgs e) 37 { 38 this.Source.Clear(); 39 this.Source.AddRange(new List<Data> 40 { 41 new Data { ItemName = "項目1" }, 42 new Data { ItemName = "項目2" }, 43 new Data { ItemName = "項目3" }, 44 }); 45 this.DataGrid.ItemsSource = this.Source; 46 47 this.ColumnsSource.Clear(); 48 this.ColumnsSource.AddRange(new List<CategoryData> 49 { 50 new CategoryData { Category = Category.Category1 }, 51 new CategoryData { Category = Category.Category2 }, 52 new CategoryData { Category = Category.Category3 } 53 }); 54 this.CategoryColumn.ItemsSource = this.ColumnsSource; 55 } 56 }

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しました。

DatagridComboBoxColumnSelectedValueBinding="{Binding ItemCategory, Mode=TwoWay}を追加したところ、実現したい通りの挙動になりました。

最終的なコードは下記のようになりました。

XAML

1<DataGrid x:Name="DataGrid" AutoGenerateColumns="False"> 2 <DataGrid.Columns> 3 <DataGridTextColumn IsReadOnly="True" Binding="{Binding ItemName}" /> 4 <DataGridComboBoxColumn x:Name="CategoryColumn" DisplayMemberPath="DataName" 5 SelectedValuePath="DataCategory" 6 SelectedValueBinding="{Binding ItemCategory, Mode=TwoWay}"> 7 </DataGridComboBoxColumn> 8 </DataGrid.Columns> 9 </DataGrid>

C#

1public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 this.InitializeComponent(); 6 } 7 8 public enum Category 9 { 10 Category1, 11 Category2, 12 Category3, 13 } 14 15 public static readonly Dictionary<Category, string> CategoryName = new Dictionary<Category, string> 16 { 17 { Category.Category1, "カテゴリ1" }, 18 { Category.Category2, "カテゴリ2" }, 19 { Category.Category3, "カテゴリ3" }, 20 }; 21 22 public class Data 23 { 24 public string ItemName { get; set; } 25 public Category ItemCategory { get; set; } 26 } 27 28 public class CategoryData 29 { 30 public string DataName => MainWindow.CategoryName[this.DataCategory]; 31 public Category DataCategory { get; set; } 32 } 33 34 private List<Data> Source = new List<Data>(); 35 private List<CategoryData> ColumnsSource = new List<CategoryData>(); 36 37 private void Window_Loaded(object sender, RoutedEventArgs e) 38 { 39 this.Source.Clear(); 40 this.Source.AddRange(new List<Data> 41 { 42 new Data { ItemName = "項目1", ItemCategory = Category.Category1 }, 43 new Data { ItemName = "項目2", ItemCategory = Category.Category2 }, 44 new Data { ItemName = "項目3", ItemCategory = Category.Category3 }, 45 }); 46 this.DataGrid.ItemsSource = this.Source; 47 48 this.ColumnsSource.Clear(); 49 this.ColumnsSource.AddRange(new List<CategoryData> 50 { 51 new CategoryData { DataCategory = Category.Category1 }, 52 new CategoryData { DataCategory = Category.Category2 }, 53 new CategoryData { DataCategory = Category.Category3 } 54 }); 55 this.CategoryColumn.ItemsSource = this.ColumnsSource; 56 } 57 }

投稿2019/03/18 04:45

編集2019/03/18 04:49
cpthgli

総合スコア76

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

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

0

コードビハインドは最近触ってないから間違ってるかもしれませんが
DisplayMemberPath="Name"
じゃなく
DisplayMemberPath="Category"でしょうかね。
あと選択のイベントハンドラを追加して下され

XML

1<DataGridComboBoxColumn.EditingElementStyle> 2 <Style TargetType="{x:Type ComboBox}"> 3 <EventSetter Event="SelectionChanged" Handler="HogeSelectionChanged" /> 4 </Style> 5</DataGridComboBoxColumn.EditingElementStyle>

投稿2019/03/18 02:30

hihijiji

総合スコア4150

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

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

cpthgli

2019/03/18 03:03

ご回答ありがとうございます。 変更後の値を反映させるには`SelectionChanged`のイベントハンドラを追加する必要があるのですね。ありがとうございます。 `DisplayMemberPath="Name"`については`enum Category`に対する表示名を指定するプロパティなので、使用方法に問題はないかと思われます。 念の為`DisplayMemberPath="Category"`に変更したところ、列挙型のメンバ名が表示されるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問