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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

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

WPF

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

Q&A

解決済

1回答

944閲覧

【C# WPF】同じ階層に格納されているデータをリンクさせて表示する方法について

tranokado

総合スコア4

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

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

WPF

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

1グッド

0クリップ

投稿2022/04/14 11:13

前提・実現したいこと

Jsonファイルに格納されている同じ階層にあるデータを、リンクさせて表示させたい(Bindingを使わずに

お世話になっております。

Jsonファイルから読み込んだデータをListボックスを用いて表示しているのですが、
リストボックス内のデータ押下時に、そのデータと同じ階層にあるデータを表示させるための方法についてお伺いしたく存じます。

また今回デバッグなどの管理の点から、データ・バインディングの技術を用いずにコードを書きたいと思っております。(コードに記しましたバインディングの記述は今後置き換えていきます)

ご教授いただく中に「データ・バインディングを使わずに」という条件をつけており、大変恐縮ですが知見のある方教えていただけますと幸いです。

コードに基づく具体的な実現したいこと

jsonデータ内の"name"をリストボックスに表示しているため、
"name"内の[katsu]を押下した際に、"sex"を表示するTextBlockをデータバインディングを用いずに実装したい

該当のソースコード

xaml

1<Window 2 x:Class="Qmpalyja24rzx8z.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Qmpalyja24rzx8z" 6 Width="800" 7 Height="450"> 8 <DockPanel> 9 <Button 10 Click="OpenButton_Click" 11 Content="読み込み" 12 DockPanel.Dock="Top" /> 13 <UniformGrid Columns="4"> 14 15 <GroupBox Header="マスター詳細"> 16 <Grid> 17 <Grid.RowDefinitions> 18 <RowDefinition /> 19 <RowDefinition /> 20 </Grid.RowDefinitions> 21 <GroupBox Header="MUData一覧"> 22 <ListBox 23 DisplayMemberPath="name" 24 IsSynchronizedWithCurrentItem="true" 25 ItemsSource="{Binding}" /> 26 </GroupBox> 27 <GroupBox Grid.Row="1" Header="Manager一覧"> 28 <ListBox DisplayMemberPath="p_name" ItemsSource="{Binding /manager_list}" /> 29 </GroupBox> 30 </Grid> 31 </GroupBox> 32 </UniformGrid> 33 </DockPanel> 34</Window>

C#

1using System.Collections.Generic; 2using System.Linq; 3using System.Windows; 4using System.Windows.Data; 5using Newtonsoft.Json; 6 7namespace Qmpalyja24rzx8z 8{ 9 public class Manager 10 { 11 public string p_name { get; set; } 12 } 13 14 public class MUData 15 { 16 public string name { get; set; } 17 public List<Manager> manager_list { get; set; } 18 } 19 20 public partial class MainWindow : Window 21 { 22 public MainWindow() => InitializeComponent(); 23 24 private void OpenButton_Click(object sender, RoutedEventArgs e) 25 { 26 var json = @" 27[ 28 { 29 ""name"": ""katsu"", 30 ""sex"": ""man"", 31 ""manager_list"": [ 32 { 33 ""p_name"": ""katsudon"" 34 }, 35 { 36 ""p_name"": ""tendon"" 37 } 38 ] 39 }, 40 { 41 ""name"": ""katsu2"", 42 ""sex"": ""woeman"", 43 ""manager_list"": [ 44 { 45 ""p_name"": ""katsudon2"" 46 }, 47 { 48 ""p_name"": ""tendon2"" 49 } 50 ] 51 } 52] 53".Trim(); 54 var data = JsonConvert.DeserializeObject<MUData[]>(json); 55 56 // マスター詳細パターン 57 DataContext = data; 58 } 59 } 60}

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

Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.1.2
C#
WPF
Newtonsoft.json

TN8001👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/04/14 11:58

先のあなたのスレッドの話の続き、もしくは関連があるなら、前のスレッドの URL を書いて、そこからどういう話になるのかなど書いてください。
tranokado

2022/04/14 12:15

こちらで解決済みのスレッドになりますかね。 url:https://teratail.com/questions/mpalyja24rzx8z 結論から申しますと特に関連はしておりません。 今回は同階層に新たなキーを設定しそれをデータバインディングを用いずに、リンクさせてTextBlockにて表示したいという内容になります。("name"を押した際に該当する"sexが表示される"TextBlock)
guest

回答1

0

ベストアンサー

ListBoxItemTemplateを設定して、ListBoxにname・sexを同時に出すこともできます。
ListBoxで選択した項目のsexを、TextBlockTextBoxに出すことも「バインディング」すれば非常に簡単にできます。

もちろん「バインディング」せずに出すこともできますが...

また今回デバッグなどの管理の点から、データ・バインディングの技術を用いずにコードを書きたいと思っております。

「デバッグなどの管理の点」これはどんな点を憂慮されているのですか?

デバッグ時は「ライブ ビジュアル ツリー」や「ライブ プロパティ」で値の確認も可能です。
WPF のデバッグ - Visual Studio (Windows) | Microsoft Docs

(コードに記しましたバインディングの記述は今後置き換えていきます)

「バインディング」を一切使用したくないって意味ですか?

WPFは「バインディング」が前提とまでは言いませんが、「バインディング」を最大限活用することにより高い生産性やパフォーマンスを実現していると思います。

もちろんWinForm的にListBox.Items.Add()とかでアイテムを追加したり、ListBox.SelectionChangedイベントで今の選択をTextBlockに出したりすることも可能です。

それ自体は個人の好みですからどうこう言うつもりはありませんが、「今までこうやってきたから」とか「なんか仕組みがよくわからないから」とか食わず嫌いであるならもったいない話です。

「バインディング」の原理自体はそんな大層なものではありませんし、「バインディング」しないWPFなんて魅力半減以下ですので。

xml

1<Window 2 x:Class="Qklt24tfmhils0v.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 Width="800" 8 Height="450" 9 mc:Ignorable="d"> 10 <DockPanel> 11 <Button 12 Click="OpenButton_Click" 13 Content="読み込み" 14 DockPanel.Dock="Top" /> 15 <UniformGrid Columns="2"> 16 17 <GroupBox Header="Binding"> 18 <Grid> 19 <Grid.RowDefinitions> 20 <RowDefinition /> 21 <RowDefinition Height="Auto" /> 22 <RowDefinition /> 23 </Grid.RowDefinitions> 24 <GroupBox Header="MUData一覧"> 25 <ListBox 26 d:ItemsSource="{d:SampleData}" 27 IsSynchronizedWithCurrentItem="true" 28 ItemsSource="{Binding}"> 29 <ListBox.ItemTemplate> 30 <DataTemplate> 31 <StackPanel> 32 <TextBlock Text="{Binding name, StringFormat=名前:{0}}" /> 33 <TextBlock Text="{Binding sex, StringFormat=性別:{0}}" /> 34 </StackPanel> 35 </DataTemplate> 36 </ListBox.ItemTemplate> 37 </ListBox> 38 </GroupBox> 39 <TextBlock Grid.Row="1" Text="{Binding /sex}" /> 40 <GroupBox Grid.Row="2" Header="Manager一覧"> 41 <ListBox DisplayMemberPath="p_name" ItemsSource="{Binding /manager_list}" /> 42 </GroupBox> 43 </Grid> 44 </GroupBox> 45 46 <GroupBox Header="not Binding"> 47 <Grid> 48 <Grid.RowDefinitions> 49 <RowDefinition /> 50 <RowDefinition Height="Auto" /> 51 <RowDefinition /> 52 </Grid.RowDefinitions> 53 <GroupBox Header="MUData一覧"> 54 <ListBox 55 x:Name="MUDataListBox" 56 DisplayMemberPath="name" 57 SelectionChanged="MUDataListBox_SelectionChanged" /> 58 </GroupBox> 59 <TextBlock x:Name="sexTextBlock" Grid.Row="1" /> 60 <GroupBox Grid.Row="2" Header="Manager一覧"> 61 <ListBox x:Name="ManagerListBox" DisplayMemberPath="p_name" /> 62 </GroupBox> 63 </Grid> 64 </GroupBox> 65 </UniformGrid> 66 </DockPanel> 67</Window>

cs

1using System.Collections.Generic; 2using System.Windows; 3using System.Windows.Controls; 4using Newtonsoft.Json; 5 6namespace Qklt24tfmhils0v 7{ 8 public class Manager 9 { 10 public string p_name { get; set; } 11 } 12 13 public class MUData 14 { 15 public string name { get; set; } 16 public string sex { get; set; } 17 public List<Manager> manager_list { get; set; } 18 } 19 20 public partial class MainWindow : Window 21 { 22 public MainWindow() => InitializeComponent(); 23 24 private void OpenButton_Click(object sender, RoutedEventArgs e) 25 { 26 var json = @" 27[ 28 { 29 ""name"": ""katsu"", 30 ""sex"": ""man"", 31 ""manager_list"": [ 32 { 33 ""p_name"": ""katsudon"" 34 }, 35 { 36 ""p_name"": ""tendon"" 37 } 38 ] 39 }, 40 { 41 ""name"": ""katsu2"", 42 ""sex"": ""woeman"", 43 ""manager_list"": [ 44 { 45 ""p_name"": ""katsudon2"" 46 }, 47 { 48 ""p_name"": ""tendon2"" 49 } 50 ] 51 } 52] 53".Trim(); 54 var data = JsonConvert.DeserializeObject<MUData[]>(json); 55 56 DataContext = data; 57 58 59 MUDataListBox.Items.Clear(); 60 ManagerListBox.Items.Clear(); 61 sexTextBlock.Text = ""; 62 foreach (var muData in data) 63 { 64 MUDataListBox.Items.Add(muData); 65 } 66 } 67 68 private void MUDataListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 69 { 70 ManagerListBox.Items.Clear(); 71 sexTextBlock.Text = ""; 72 73 var muData = (MUData)MUDataListBox.SelectedItem; 74 if (muData != null) 75 { 76 sexTextBlock.Text = muData.sex; 77 foreach (var manager in muData.manager_list) 78 { 79 ManagerListBox.Items.Add(manager); 80 } 81 } 82 } 83 } 84}

厳密にはDisplayMemberPathは「バインディング」に含まれる気がしますが、面倒なので見なかったことにします^^;

投稿2022/04/14 13:56

編集2023/07/30 06:43
TN8001

総合スコア9317

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

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

tranokado

2022/04/15 13:29

ご回答遅くなり申し訳ございません。 「バインディングを使わずに」という合理性に欠けた質問に対しましてご丁寧にお答えしていただきありがとうございます。 無事コーディングを行うことができました。 またWPFにおけるバインディングの立ち位置についての認識が甘かったと実感しています。 社内のENからバインディング管理の難しさについて伺いましたがしっかりとした根拠を自分自身で落とし込めていませんでした。 利用に伴う便利な部分不便な部分を自分の中で整理出来たらまたどこかで記述、相談したいなと思っております。 この度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問