実現したいこと
- comboboxの属性として「ItemSource="{Binding}"」と記載されているのですが、ネットで調べると
"{Binding XXX}"のように記載する方法しか見つかりませんでした。
"{Binding}"のように「XXX」部分(選択肢の値を示す変数)がない形の記載もできるのでしょうか?
また、"{Binding}"のように記載する方法では、選択肢は一般的にどこで定義されるものなのでしょうか?
補足
ほかの方が作成したC#のプログラムの処理内容を確認しているのですが(私はC#の初心者です)
comboboxの属性として「ItemSource="{Binding}"」と記載されております。
アプリをデバッグしたときに表示された選択肢の値で、ソリューションフォルダ内をGrep(サクラエディタ)してみたのですがGrepには1件もヒットせず、選択肢が定義されているファイルを見つけることができませんでした。
些細なことでもご意見いただけると大変助かります(>_<)
何卒宜しくお願いいたします。
<Combobox Name="XXXXX" ItemSource="{Binding}" ・・・・ のように記載されております。
この質問を閲覧した人には、現在の記載内容では判断つかないと思いますよ。たくさんやり方があります。C#の問題というよりはWPFのXAML、データバインディングに関係することで、ItemSourceに動的に値をセットしている場合、固定値でファイルに書かれているとは限りません。
「WPF ComboBox ItemSource データバインディング」などで検索してみて、基本的な部分を学んでみてからの方が理解は早いし、質問のポイントも絞れてくるかあるいは自分で解決できるようになると思います。
これだけの情報ではdodox86さんの言う通り一般的な事柄しか答えられません。
少なくともツリー構造が分かるWindow.xamlとWindow.xaml.cs・ViewModel.csが必要です。
以下一般的な事柄
xamlを使用する「デスクトップアプリ」はWPFやUWP等複数あります(共通する事柄も多いですが)
"{Binding}"とした場合そのコントロールのDataContext自体にバインドします。
そのコントロールのDataContextがなんなのかは、その上(ツリーの上位)のxamlがどうなっているかによります。
通常ItemsSourceに設定するものは配列やList・Dictionaryぐらいですが、必ずしもstringとは限りません。
クラスが入っている場合もあります。そうなるとC#コード上では単純に { "aa", "bb", } のようにわかりやすく並んでない可能性があります。
SelectedValuePathやDisplayMemberPathも設定されていますか?
DataContextChangedイベントを設定して、e.NewValueで型や中身を確認してみてください。
バインディングやDataContextに関して不慣れであれば、ざっと目を通しておいてください。
[wpf binding - Google 検索](https://www.google.co.jp/search?q=wpf+binding&lr=lang_ja)
[wpf datacontext - Google 検索](https://www.google.co.jp/search?q=wpf+datacontext&lr=lang_ja)
dodox86さん
コメントいただき誠にありがとうございます。
大変失礼いたしました。
理解および質問内容の記載が不十分でした。
(質問内容を少し修正いたしました。まだ質問内容が明確になっておりませんので、理解を深めるためにcomboboxやdatacontextについて勉強します)
TN8001さん
コメントいただき誠にありがとうございます。
"{Binding XXX}"のように記載しないといけないのでは?と思っていたのですが、
"{Binding}"の記載の方法もあるのですね。
大変勉強になります。「DataContext」については知らなかったので勉強してみます。
行き詰まっているところ、ヒントをいただけて大変助かりました。本当にありがとうございます。
> "{Binding XXX}"のように記載しないといけないのでは?と思っていたのですが、
> "{Binding}"の記載の方法もあるのですね。
はい。
ただComboBoxのItemSourceに"{Binding}"を使うのは、「そうそうないなぁ」という気はします。
「ItemSource="{Binding}"」 11件(すべてPropertyGrid相手)
[Code search results](https://github.com/search?q=ItemSource%3D%22%7BBinding%7D%22+language%3AXML&type=code)
「ItemSource="{Binding」 408件(思ったより少ないな)
[Code search results](https://github.com/search?q=ItemSource%3D%22%7BBinding+language%3AXML&type=code)
Content="{Binding}" という使い方は頻出します。
「Content="{Binding}"」 6k件(これはやけに多いな^^;
[Code search results](https://github.com/search?q=Content%3D%22%7BBinding%7D%22+language%3AXML&type=code)
データベースから取得した値やWeb APIから取得した値等、プログラム外から来たものという可能性はないですか?
「"選択肢" + 1」等「"選択肢1"」では引っかからないような作り方をしているとか?
あるいはリソースに定義しているとか?(すべてのファイルでgrepなら引っかかるかな??)
意地悪な方法はいくらでもあるでしょうけど、わざわざそんなことしないですよねぇ?w
> 行き詰まっているところ、ヒントをいただけて大変助かりました。本当にありがとうございます。
調べてみて自力で解決できたなら「自己解決」として質問を「解決済」にしてください。
[ヘルプ|質問をした後に自己解決してしまった](https://teratail.com/help#resolve-myself)
そうでないなら質問に情報を追記してください。
TN8001さん
大変お世話になっております。
コメントいただき誠にありがとうございます。
教えていただいことを元に勉強し、再度確認してみたところ、
おそらくなのですが、C#のコードの中でデータべースから取得した値の一覧をcomboboxのItemSourceに設定しているようでした。(おそらくですが(笑))
■補足
AAAA.xamlファイル
→<ComboBox Name="test" ItemSource="{Binding}" ・・・のように記載されているファイル
AAAA.xaml.csファイル
→ファイル名と同じメソッド(おそらく初期化時に起動するのかと思っています)にて
データベースから値を取得した後に、それを下記のようにして設定している箇所がありました。
this.test.ItemSource = (データベースから取得した値を格納したリスト)
comboboxの親はGrid(その親もGrid)になってるのですが、Gridのdatacontextに値が設定されてる箇所はなさそうでした(私の理解不足で単に見つけられていない可能性はありますが(汗))
TN8001さんのおかげでWPFへの理解が少し深まりました。本当に助かりました。
感謝です、ありがとうございました!
> ファイル名と同じメソッド(おそらく初期化時に起動するのかと思っています)にて
コンストラクタのことですね。↓のような。
public partial class AAAA : ???
{
public AAAA()
{
InitializeComponent();
this.test.ItemSource = 。。。
}
}
[コンストラクター - C# プログラミング ガイド | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/constructors)
> それを下記のようにして設定している箇所がありました。
だったら「ItemSource="{Binding}" いらないじゃん」ってのはありますがw
なんにせよ解決されたようでよかったです^^
回答1件
あなたの回答
tips
プレビュー