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

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

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

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

WPF

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

解決済

【WPF】Dictonaryの値をコンボボックスに表示できない、クラスを参照したい

taroko
taroko

総合スコア58

C#

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

WPF

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

3回答

0評価

1クリップ

794閲覧

投稿2021/06/24 04:00

編集2022/03/30 19:58

前提・実現したいこと

初歩的な話で大変申し訳ないのですが、
組み方が良く分からないので質問させてください。

【WPF】Rectangleの線の色「Brushes.Red」などを、文字列で指定したい
https://teratail.com/questions/344646

上記で頂いている「TN8001」様の回答をもとに
データをClassファイルに分けて他のxamlからも参照出来るようにしたいと思っています。

・他から参照できるよう、NowData.csクラスに値を入れたい
Classを作成し、そこで値を共有(?)することは出来ています。
ただ、今回のは複雑だからか上手くいかず、コンボボックスに何も表示されません。

・全部のxamlから参照できるDictionaryは作成できるのか
(コンボボックスの選択肢項目は共通なので、1つの場所で管理出来たらいいなと思っています)

改変していますが、なぜコンボボックスに何も表示されないのか分からず
手詰まりの状態です。
コメントアウトしているところを、表示にしたり非表示にしたりしてテストしていました。

たぶん初歩的な話なのだと思いますが、
申し訳ありませんが教えて頂けると嬉しいです。

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

xaml

<Window x:Class="TEST1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TEST1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources></Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <DockPanel> <TextBlock VerticalAlignment="Center" Text="線の色" /> <ComboBox x:Name="BordColorC2" Margin="5" ItemsSource="{Binding Colors}" SelectedValue="{Binding DefoColors}" SelectedValuePath="Key" SelectionChanged="BordColorC2_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <DockPanel> <Ellipse Width="16" Height="16" Fill="{Binding Value}" /> <TextBlock Margin="5,0" VerticalAlignment="Center" Text="{Binding Key}" /> </DockPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </DockPanel> <Rectangle Name="Rectan2" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> </Grid> </Window>

C#

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace TEST1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void BordColorC2_SelectionChanged(object sender, SelectionChangedEventArgs e) { var pair = (KeyValuePair<string, SolidColorBrush>)BordColorC2.SelectedItem; Rectan2.Stroke = pair.Value; } } }

cs

//NowData.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; namespace TEST1 { class NowData { public static string NowBordColor { get; set; } } //public static Dictionary<string, SolidColorBrush> Colors { get; } = // new Dictionary<string, SolidColorBrush> // { // {"Red", Brushes.Red }, // {"Blue", Brushes.Blue }, // {"Green", Brushes.Green }, // {"白", Brushes.White }, // {"黒", Brushes.Black }, // {"透明", Brushes.Transparent }, // }; }

App.xaml

<Application x:Class="TEST1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TEST1" xmlns:System="clr-namespace:System;assembly=mscorlib" StartupUri="MainWindow.xaml"> <Application.Resources> <x:Array x:Key="Colors" Type="System:String"> <System:String>Transparent</System:String> <System:String>Red</System:String> <System:String>Blue</System:String> <System:String>Green</System:String> <System:String>White</System:String> <System:String>Black</System:String> </x:Array> </Application.Resources> </Application>

参考にさせて頂いているソース

xaml

<Window x:Class="Questions344646.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" Width="600" Height="400" Background="LightGray"> <Window.Resources> <x:Array x:Key="Colors" Type="System:String"> <System:String>Red</System:String> <System:String>Blue</System:String> <System:String>Green</System:String> <System:String>White</System:String> <System:String>Black</System:String> <System:String>NoColor</System:String> </x:Array> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <GroupBox Header="BrushConverter"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <DockPanel> <TextBlock VerticalAlignment="Center" Text="線の色" /> <ComboBox x:Name="BordColorC" Margin="5" ItemsSource="{StaticResource Colors}" SelectedValue="{Binding DefoBordColor}" SelectionChanged="BordColorC_SelectionChanged" /> </DockPanel> <Rectangle Name="Rectan" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> </Grid> </GroupBox> <GroupBox Grid.Column="1" Header="Dictionary"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <DockPanel> <TextBlock VerticalAlignment="Center" Text="線の色" /> <ComboBox x:Name="BordColorC2" Margin="5" ItemsSource="{Binding Colors}" SelectedValue="{Binding DefoBordColor2}" SelectedValuePath="Key" SelectionChanged="BordColorC2_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <DockPanel> <Ellipse Width="16" Height="16" Fill="{Binding Value}" /> <TextBlock Margin="5,0" VerticalAlignment="Center" Text="{Binding Key}" /> </DockPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </DockPanel> <Rectangle Name="Rectan2" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> </Grid> </GroupBox> </Grid> </Window>

C#

using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Questions344646 { public class DefaultData { public static string DefoBordColor { get => Properties.Settings.Default.DefaBordColor; set => Properties.Settings.Default.DefaBordColor = value; } public static string DefoBordColor2 { get => Properties.Settings.Default.DefaBordColor2; set => Properties.Settings.Default.DefaBordColor2 = value; } public static Dictionary<string, SolidColorBrush> Colors { get; } = new Dictionary<string, SolidColorBrush> { {"Red", Brushes.Red }, {"Blue", Brushes.Blue }, {"Green", Brushes.Green }, {"白", Brushes.White }, {"黒", Brushes.Black }, {"透明", Brushes.Transparent }, }; } public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // xamlから逆算するとこうなっているってこと??(ちょっと変わってますね^^; DataContext = new DefaultData(); } protected override void OnClosing(CancelEventArgs e) { Properties.Settings.Default.Save(); } private void BordColorC_SelectionChanged(object sender, SelectionChangedEventArgs e) { var name = BordColorC.SelectedItem.ToString(); try { var brush = (SolidColorBrush)new BrushConverter().ConvertFromString(name); Rectan.Stroke = brush; } catch { Rectan.Stroke = Brushes.Transparent; } } private void BordColorC2_SelectionChanged(object sender, SelectionChangedEventArgs e) { var pair = (KeyValuePair<string, SolidColorBrush>)BordColorC2.SelectedItem; Rectan2.Stroke = pair.Value; } } }

補足情報(FW/ツールのバージョンなど)

VisualStudio 2019
.NET Framework 4.5⇒4.7.2にバージョンアップ
WPF C# (※ WinFormではない)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

gentaro

2021/06/24 04:28

「.NET」だけで表記できるのは.NET 5からなんで「.NET Framework」じゃないの? 場合によっては回答が無駄になる可能性があるから、バージョンはしっかり確認してから書こう。
TN8001

2021/06/24 10:54

> ・他から参照できるよう、NowData.csクラスに値を入れたい 他からは参照するだけなのか、代入もあるのか? > public static string NowBordColor { get; set; } > Properties.Settings.Default.DefaBordColor 前回はSettings.settingsを使っていたがただのプロパティになっているのは省略しただけで、本来はSettingsを使う予定なのか? > ・全部のxamlから参照できるDictionaryは作成できるのか staticなDictionaryをxamlからバインドするのは、{x:Static local:NowData.Colors}とするだけです。 しかしNowBordColorも同様にすると、多数の落とし穴があって全然簡単な話ではないのです^^; 結局DataContext = new NowData();とするのが話が早い可能性がありますが、DataContextとは何かというところを理解する必要があります(これは基本であり一番の肝の部分です)
taroko

2021/06/24 23:47

TN8001様 回答ありがとうございます。 代入もあります。 ・全データ ・今参照しているデータ(全データの中の1行分のデータ) ・デフォルトで入れたいデータ(Settings.settings) この3種類のデータがあります。 今回のサンプル?として表示したものは、「今参照しているデータ」なので ただのプロパティとしました。 FillColorとBordColorがあるのですが、 コンボボックスの選択肢は共通として 選択後の値を別のプロパティに保存して管理出来たらなと思ってます。 これを3種類のデータで別管理するのもどうなのかと思ったため まとめられないかと思いました。 (頂いた内容に返事できているかどうか…すみません) BindingとかDataContextとか、中々難しく、まだ理解できてません。 良く利用されていることなので理解すべきとは思ってますが なんとなく。 DataContextは、全体の変数をまとめたファイル参照みたいなイメージで そこにあるXとかその他変数をBindingできるのかなという… 雑ですみません。
Zuishin

2021/06/25 23:02

Binding も DataContext もわからない縛りでプログラミングしなきゃいけないという拷問をなぜ選ぶのか。調べてもいいのなら調べればいいのに。
okazuki0130

2021/06/26 11:45

Binding は雑に言うとソースに設定されているオブジェクトのプロパティをコントロールのプロパティと同期をするためのものです。Binding の Source プロパティを省略した場合、Source は DataContext になります。なので「DataContextは、全体の変数をまとめたファイル参照みたいなイメージで そこにあるXとかその他変数をBindingできる」でおっしゃってるような動きをします。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

WPF

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