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

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

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

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

WPF

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

Q&A

解決済

2回答

3483閲覧

ComboBoxの選択中の値をListBoxに表示する方法

dai49

総合スコア14

C#

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

WPF

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

0グッド

1クリップ

投稿2019/01/30 00:59

編集2019/01/31 02:45

C#を勉強している初心者です。
下記サイトのコードを参考にしていて、試しに選択中のものをListBoxに表示させようとしたとき上手くいかずに詰まってしまったので質問させていただきました。
https://social.msdn.microsoft.com/Forums/ja-JP/c21a0bf4-46b8-4273-a810-255320d0ad3d/combobox12398369842524620013123982051612434viewmodel1236312425353732?forum=wpfja

ラベルに表示される内容と同じものをListBoxに表示させようとしましたが、1文字1文字分割されて数行で表示されてしまいます。
これを一行で表示する、コレクションの別の値を複数表示させるにはどのようにしたらいいのか分かる方ご教示ください。
よろしくお願いいたします。

XAML

1<Window x:Class="WpfTest1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfTest1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="300" Width="360" Name="UI"> 9 10 <Window.DataContext> 11 <local:MainWindowViewModel/> 12 </Window.DataContext> 13 14 <Grid> 15 <Grid.RowDefinitions> 16 <RowDefinition Height="1*"/> 17 <RowDefinition Height="1*"/> 18 <RowDefinition Height="1*"/> 19 </Grid.RowDefinitions> 20 <ComboBox x:Name="Maker" Margin="16" 21 ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=Item,Mode=TwoWay}"> 22 <ComboBox.ItemTemplate> 23 <DataTemplate> 24 <StackPanel Orientation="Horizontal"> 25 <TextBlock Text="{Binding Path=Name}" Width="100"/> 26 <TextBlock Text="{Binding Path=TEL}"/> 27 </StackPanel> 28 </DataTemplate> 29 </ComboBox.ItemTemplate> 30 </ComboBox> 31 <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="16"> 32 <TextBlock Text="担当者:"/> 33 <TextBlock Text="{Binding ElementName=Maker, Path=SelectedItem.Tantou}"/> 34 </StackPanel> 35 <ListBox x:Name="ListBox1" ItemsSource="{Binding ElementName=Maker, Path=SelectedItem.Tantou}" HorizontalAlignment="Left" Height="69" Margin="123,10,0,0" Grid.Row="2" VerticalAlignment="Top" Width="78"> 36 </Grid> 37</Window>

C#

1using System; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7using System.ComponentModel; 8 9namespace WpfTest1 10{ 11  class Maker 12 { 13 public int Id { get; set; } 14 public string Name { get; set; } 15 public string TEL { get; set; } 16 public string Tantou { get; set; } //担当者 17 } 18 19 class MainWindowViewModel : INotifyPropertyChanged 20 { 21 private ObservableCollection<Maker> items = new ObservableCollection<Maker>(); 22 public ObservableCollection<Maker> Items 23 { 24 get { return items; } 25 set { items = value; } 26 } 27 28 private Maker item; 29 public Maker Item 30 { 31 get { return item; } 32 set 33 { 34 35 if (item == value) return; 36 item = value; 37 NotifyPropertyChanged("Item"); 38 } 39 } 40 41 public MainWindowViewModel() 42 { 43 //初期値 44 items = new ObservableCollection<Maker>{ 45 new Maker{Id=1,Name="YAMAHA",TEL="06-9931-1584",Tantou="紺野佐吉,堀江明里"}, 46 new Maker{Id=2,Name="NEC",TEL="07-903-6820",Tantou="古屋冨士夫,大江薫"}, 47 new Maker{Id=3,Name="バッファロー",TEL="0885-40-6796",Tantou="国分七美,宮坂理香"}, 48 new Maker{Id=4,Name="エレコム",TEL="02-2748-8396",Tantou="日比野美香,渡辺徳雄"}, 49 new Maker{Id=5,Name="IODATA",TEL="098-333-1626",Tantou="神谷基一,望月幸彦"}, 50 new Maker{Id=6,Name="Cisco",TEL="04-0380-5406",Tantou="岩渕和歌,三村国男"}, 51 new Maker{Id=7,Name="NetGear",TEL="024-450-5136",Tantou="鎌田絵理,細谷彩香"} 52 }; 53 } 54 55 56 public event PropertyChangedEventHandler PropertyChanged; 57 protected void NotifyPropertyChanged(String info) 58 { 59 if (PropertyChanged != null) 60 { 61 PropertyChanged(this, new PropertyChangedEventArgs(info)); 62 } 63 } 64

※追記
下記の画像のような表示を考えています。
イメージ説明

papinianus様にご提示いただいたコードでイメージしていた表示になりました。
他にもこんなやり方あるよという方いましたらご教示ください。

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

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

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

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

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

papinianus

2019/01/30 01:38

ListBoxは複数のものを入れるためのものなんで、文字列をバインドしちゃうと、自動的に文字が複数あるんだなと思ってしまうんですが、どうしてもListBoxじゃないといけませんか?
dai49

2019/01/30 02:31

回答ありがとうございます。 それで1文字ずつ表示されてしまっていたんですね。 コレクションの各プロパティを一行ずつ表示できるイメージでした。 ListBox 以外だとどのような方法がありますか?
papinianus

2019/01/30 02:35 編集

方法というか、ユーザインターフェイスなので、何に出したいか、じゃないしょうか。絶対に1つしかない選択値をリストとして表示するのはユーザインターフェイスとしてあまり良いと思えないです。既存コードのままテキストボックス(テキストボックスを複数用意するの意味です)ではダメなのでしょうか。というか、勉強のステップとして、何が目的なのでしょう?
dai49

2019/01/30 05:56

参考にさせていただいたコードだとTextBlockにTantouしか表示できませんが、目標は選択された項目のIDやNameなどの複数の値をListBoxのような複数選択できるようなコントロールに表示し、さらにそこで選択された値を別のメソッドに渡すような動きを考えています。
guest

回答2

0

プロパティウィンドウ<property window/grid> in WPF

こんな感じではないですか?

投稿2019/01/30 08:33

Zuishin

総合スコア28660

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

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

dai49

2019/01/31 02:53

回答ありがとうございます。 ComboBoxで名前を指定したらご提示いただいたサイトのプロパティ画像で書かれている各項目を紐づいている分だけListBoxに一覧で表示させたい感じです。 イメージしているものを追記しましたので見ていただけると幸いです。
Zuishin

2019/01/31 02:57

リストボックスではなくユーザーコントロールを作るのがいいと思います。
guest

0

ベストアンサー

質疑の↓に対する回答

参考にさせていただいたコードだとTextBlockにTantouしか表示できませんが、目標は選択された項目のIDやNameなどの複数の値をListBoxのような複数選択できるようなコントロールに表示し、さらにそこで選択された値を別のメソッドに渡すような動きを考えています。

正直そんなUI見たことないし、やめたほうがいいです
(特殊ってことは、サンプルや適切な参考書が見つからないってことですし、苦労して作ってもユーザは使いにくくて、何のために苦労するのか訳わからないです。ちなみにそういうオレオレインターフェイスを持つ製品の保守開発した経験から申し上げています)

どうしてもやりたいなら、まずクラス定義でそういうプロパティを作って

csharp

1  class Maker 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 public string TEL { get; set; } 6 public string Tantou { get; set; } //担当者 7 public string Selection { get => new []{Name, TEL, Tantou}; } //これな 8 }

xamlのバインディングで、Pathを今つくったやつ(Selection)にすればいいと思う

XAML

1<ListBox x:Name="ListBox1" ItemsSource="{Binding ElementName=Maker, Path=SelectedItem.Selection}" HorizontalAlignment="Left" Height="69" Margin="123,10,0,0" Grid.Row="2" VerticalAlignment="Top" Width="78">

動作検証してませんが。

投稿2019/01/30 06:14

papinianus

総合スコア12705

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

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

dai49

2019/01/31 02:39

ありがとうございます。 いただいたコードでListBoxに表示することができました。 追加で質問させていただきたいのですが、Selectionで表示させたいプロパティを明示していますがitemsの各要素全部表示するといったことは可能でしょうか?
papinianus

2019/01/31 03:02

意図が曖昧です。 1. class Makerのプロパティが増えたときに(新しい項目が増えたときに)自動でという意味ですか? 2. MainWindowViewModel.itemsに格納された複数のメーカ情報を全部列挙という意味ですか? いずれにしても、どちらも可能です。 1. リフレクションを使えばできますが、私個人の考えとして、明示できるものは明示すべきと考えます。自分でクラス定義をしているのですから、明示できないはずがないです。クラス定義がかわればアセンブリが更新されます。そこだけ手抜きする意味が全く分かりません。そういうのが嫌だったら最初からC#(静的型言語)はやめたほうがいいと思います。 2. それはもはやMakerのやることじゃないです。ViewModelに別途プロパティを持つことになります。しかしながら、そこで列挙されるものは上のリストボックスにあるので、それを展開するっていうのが良く分からないです。仮に"yamaha"と"nec"と"02-2748-8396"(エレコムの電話番号)が選択されたときに、一体全体どういう処理をしたいのでしょうか。そのような、なんでもかんでもつっこんだごった煮からできることなんてありません。IDがint型なんでSelectionには入れていませんが、仮にIDはそこに入ってしまうと、数値に戻す処理がなければ何もしようがないものです。 プログラムを書けば大抵のことはできます。しかし、何の利用価値もなく、誰も嬉しくないような、賽の河原の石積みをする気は私はありません。 何がしたいのか分かりませんが、うっすら想定するところではDataGridあたりから調べ直したほうがよいように思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問