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

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

新規登録して質問してみよう
ただいま回答率
85.37%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

XAML

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

WPF

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

Q&A

解決済

2回答

13007閲覧

WPFでDataGridのComboBoxへのBinding方法

hiro0

総合スコア5

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

XAML

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

WPF

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

1グッド

0クリップ

投稿2020/01/08 14:07

前提・実現したいこと

WPFの編集可能なDataGridのComboBoxへ値をBindingしたいのですがうまくいきません。
ComboBoxのData Bindingについて検索してみましたがずばりこのパターンが見つからなかったのでご教示願います。

.Net Core 3.0
Prism 7.2.0.1367

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

ListViewだと期待通りの表示がされるがComboBoxには何も表示されない。

ソースコード

MainWindowViewModel.cs

C#

1using Prism.Mvvm; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4 5namespace DataGridComboBox.ViewModels 6{ 7 public class MainWindowViewModel : BindableBase 8 { 9 private string _title = "Prism Application"; 10 public string Title 11 { 12 get { return _title; } 13 set { SetProperty(ref _title, value); } 14 } 15 16 public ObservableCollection<Item> Data { get; set; } = new ObservableCollection<Item>(); 17 18 public class Item 19 { 20 public string Name { get; set; } 21 public CategoryType Category { get; set; } 22 } 23 24 public class CategoryType 25 { 26 public static readonly CategoryType None = new CategoryType(0); 27 public static readonly CategoryType Category1 = new CategoryType(1); 28 public static readonly CategoryType Category2 = new CategoryType(2); 29 30 public string DisplayValue 31 { 32 get 33 { 34 if (this == None) return "不明"; 35 if (this == Category1) return "カテゴリ1"; 36 if (this == Category2) return "カテゴリ2"; 37 return "不明"; 38 } 39 } 40 41 public int Value { get; } 42 public CategoryType(int value) 43 { 44 Value = value; 45 } 46 } 47 48 public MainWindowViewModel() 49 { 50 Data.AddRange(new List<Item> { 51 new Item() { Name = "No1" , Category = CategoryType.None }, 52 new Item() { Name = "No2", Category = CategoryType.Category1 }, 53 new Item() { Name = "No3", Category = CategoryType.Category2 } 54 }); 55 } 56 } 57}

MainWindow.xaml

xaml

1<Window x:Class="DataGridComboBox.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 prism:ViewModelLocator.AutoWireViewModel="True" 6 Title="{Binding Title}" Height="350" Width="525" > 7 <StackPanel> 8 <DataGrid ItemsSource="{Binding Data , Mode=TwoWay}" CanUserAddRows="True" CanUserDeleteRows="True" AutoGenerateColumns="False"> 9 <DataGrid.Columns> 10 <DataGridTextColumn Header="名前" Binding="{Binding Name}" /> 11 <DataGridTemplateColumn Header="カテゴリ"> 12 <DataGridTemplateColumn.CellTemplate> 13 <DataTemplate> 14 <ComboBox ItemsSource="{Binding Category}" DisplayMemberPath="Category.DisplayValue" /> 15 </DataTemplate> 16 </DataGridTemplateColumn.CellTemplate> 17 </DataGridTemplateColumn> 18 </DataGrid.Columns> 19 </DataGrid> 20 <ListView ItemsSource="{Binding Data}"> 21 <ListView.View> 22 <GridView> 23 <GridViewColumn Header="名前" DisplayMemberBinding="{Binding Name}" /> 24 <GridViewColumn Header="カテゴリ" DisplayMemberBinding="{Binding Category.DisplayValue}" /> 25 </GridView> 26 </ListView.View> 27 </ListView> 28 </StackPanel> 29</Window>
TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

ComboBoxなので、選択肢ItemsSourceにBindingする必要があります。
CategoryはSelectedItemにあたります。

変更した点のみ記載します。

xml

1<DataTemplate> 2 <ComboBox 3 DisplayMemberPath="DisplayValue" 4 ItemsSource="{Binding CategoryTypes}" 5 SelectedItem="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 6 <!--<ComboBox.ItemsSource> 7 <x:Array Type="{x:Type viewModels:CategoryType}"> 8 <x:Static Member="viewModels:CategoryType.None" /> 9 <x:Static Member="viewModels:CategoryType.Category1" /> 10 <x:Static Member="viewModels:CategoryType.Category2" /> 11 </x:Array> 12 </ComboBox.ItemsSource>--> 13 </ComboBox> 14</DataTemplate>

cs

1public class Item : BindableBase 2{ 3 public string Name { get; set; } 4 private CategoryType _category; 5 public CategoryType Category { get => _category; set => SetProperty(ref _category, value); } 6 7 // なんだかなって気もするのでxamlで与えたほうがいいか? 8 // xamlで指定する場合は入れ子だとエラーになるのでclass CategoryTypeを外に出す必要あり 9 public static List<CategoryType> CategoryTypes { get; } = new List<CategoryType> { CategoryType.None, CategoryType.Category1, CategoryType.Category2 }; 10}

投稿2020/01/09 08:57

編集2023/07/17 13:41
TN8001

総合スコア9807

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

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

hiro0

2020/01/13 11:42

ありがとうございます。 無事目的の表示になりました。
guest

0

ItemクラスのCategoryはコレクションではありませんから、ComboBox のItemsSourceには指定できません。
ItemsSource 用のCategoryTypeのコレクションを作ってComboBox のItemsSourceにバインドしてください。
ItemクラスのCategoryはSelectedItemにでもバインドしてください。

投稿2020/01/09 01:45

hihijiji

総合スコア4152

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

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

hihijiji

2020/01/09 01:49

DisplayMemberPathの Category. も余計ですね。
hihijiji

2020/01/09 02:25

バインディングにミスがある場合には大概デバッグ時の出力ペインにバインディングエラーが出ています。 それが一つもなくなるまでバグ取りしてください。
hiro0

2020/01/13 11:41

ありがとうございます。 なるほど、ComboBoxのItemsSourceはコレクションを作って指定する必要があるのですね。 enumを使ったサンプルが多いのはそういう事でしたか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問