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

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

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

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

Q&A

2回答

3325閲覧

【C#, WPF】ListBoxにIdの指すインスタンスをIdの代わりに表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

4クリップ

投稿2014/10/23 08:57

質問の要点は以下のとおりです。

  • WPFでListBoxにID(int型)のリストをバインドしている。しかしListBoxにはIDそのものではなくIDの指すインスタンスの名前を表示したい。何かいい方法はないだろうか。
  • IDの指し示すデータはViewModelに用意されている。別の場所へ移しても構わない。

次のコードは、WPFでIDのリストにIDを追加していくことのできるアプリケーション コードの一部です。いま私が直面している問題を単純にしたものとなります。

lang

1class Hoge 2{ 3 public int Id { get; set; } 4 public string Name { get; set; } 5 6 public Hoge(int id, string name) 7 { 8 Id = id; 9 Name = name; 10 } 11} 12 13class ViewModel 14{ 15 // IDリスト 16 public ObservableCollection<int> ObjectIds { get; set; } 17 18 // IDの指すインスタンスのリスト 19 public ObservableCollection<Hoge> AvailableHoges { get; set; } 20 21 #region AddCommand 22 23 private void AddCommandHandler(object parameter) 24 { 25 ObjectIds.Add((int)parameter); 26 } 27 28 public ICommand AddCommand 29 { 30 get 31 { 32 if(_AddCommand == null) 33 _AddCommand = new DelegateCommand { CommandHandler = this.AddCommandHandler }; 34 return _AddCommand; 35 } 36 } 37 private ICommand _AddCommand; 38 39 #endregion 40 41 public ViewModel() 42 { 43 AvailableHoges = new ObservableCollection<Hoge>() 44 { 45 new Hoge(1, "Foo"), 46 new Hoge(2, "Bar"), 47 new Hoge(3, "Fizz"), 48 }; 49 ObjectIds = new ObservableCollection<int>(); 50 } 51}

このViewModelを次のXAMLコードにバインディングしています。

lang

1<Window x:Class="IdBinding.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow" Height="350" Width="525"> 5 <StackPanel> 6 <ListBox ItemsSource="{Binding ObjectIds}" Height="100"/> 7 <ComboBox ItemsSource="{Binding AvailableHoges}" 8 Name="combo" 9 DisplayMemberPath="Name" 10 SelectedValuePath="Id"/> 11 <Button Content="追加" 12 Command="{Binding AddCommand}" 13 CommandParameter="{Binding SelectedValue, ElementName=combo}"/> 14 </StackPanel> 15</Window>

ComboBoxで選択しているHogeクラスのインスタンスのIdが、追加ボタンを押した時にListBoxにバインディングされているリストに追加される仕組みになっています。このままだとListBoxには追加されたIdの数字が表示されるのですが、今回はIdが指すAvailableHoge中のHogeクラスのNameを代わりに表示したいと思っています。期待する結果としては、この例ならリストに「1,1,2,3」と表示する代わりに「Foo,Foo,Bar,Fizz」と表示されるようにしたいと思っています。

この例ではListBoxにバインドされているObjectIdsをHogeクラスのリストに変更することでも解決するのですが、今直面している実際の問題ではObjectIdsの型を変更することが難しいため、別の方法を探しています。

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

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

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

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

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

guest

回答2

0

値コンバータを使ってください。

投稿2018/03/05 23:04

Zuishin

総合スコア28656

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

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

0

もっとも簡単で美しい解決策は「IDの型をenumに変更する」でしょうね。

lang

1enum ObjectID 2{ 3 Foo = 1, 4 Hoge = 2, 5 Fizz = 3, 6}

こうするだけで、とりあえず要件は満たせるはずです。(^<^)

もっとも現実はそれほど単純でなく、ローカライズなども考えると
IValueConverter インターフェイスを実装するクラスを作成する
または XAML で場合分けをきっちり書くことになりそうです。

投稿2014/12/05 14:20

vga640x480

総合スコア13

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

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

退会済みユーザー

退会済みユーザー

2014/12/06 10:21

回答ありがとうございます。 確かに今回の例はその方法で解決できるのですが、私の直面している実際の問題では以下の条件があるためこの方法が使えません。 ・IDが指し示すオブジェクトは名前以外のメンバも持つ複雑なデータである。列挙型だと名前しか持つことができない。 ・IDが指し示すオブジェクトはファイルから読み込むなどして動的に生成される。列挙型だと静的にしか変更できない。 お見せした例に説明不足があったことをお詫びします。
vga640x480

2014/12/08 05:10

まぁ…そうでしょうね。 いきなりハシゴを外された感じが切ないです。 AvailableHogesの内容は動的に生成されることからXAMLで解決するのは難しく、 ObservableCollection=追加削除がランタイムで行われると考えると、ValueConverterによる実装も難しい。 お役に立てず残念です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問