
前提・実現したいこと
WPFのアプリケーションで、読み込んだJsonファイルを編集しその変更を元のJsonファイルにも適用させたい
お世話になります。
現在WPFのアプリケーションを作成しており、
画面上の「開く」ボタンを押すことでエクスプローラーからjsonファイルを呼び出し
デシリアライズを行って画面上に必要なデータを表示する
部分までの機能を実装しています。
今後このデータを画面上で編集する機能を作成したいと思っているのですが、どのように実現するのがよいかわからず詰まってしまっている状況です。
jsonデータを編集する機能についてご教授いただけますと幸いです。
コードに基づく具体的な実現したいこと
- subname欄に表示される項目押下時、その項目をsubnameから排除(取り除く)する機能
- subname欄に表示される項目押下時、その項目を別のnameに移動またはコピーさせる機能
- subnameを追加する機能
該当のソースコード
xaml
1<Window x:Class="ManagerEditor.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:ManagerEditor" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="800" Width="1100"> 9 <Grid> 10 <Grid x:Name="LeftRoot" Margin="10,10,-10,-10"> 11 <Grid.ColumnDefinitions> 12 <ColumnDefinition Width="10*"/> 13 <ColumnDefinition Width="27*"/> 14 </Grid.ColumnDefinitions> 15 <Button x:Name="OpenButton" Width="120" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0" Content="開く" FontSize="18" Click="OpenButton_Click" /> 16 <TextBlock HorizontalAlignment="Left" Margin="10,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="31" Width="101" FontSize="18"><Run Language="ja-jp" Text="name"/><LineBreak/><Run Language="ja-jp"/></TextBlock> 17 <ListBox x:Name="UnitnameListBox" SelectionChanged="UnitNameListBox_SelectionChanged" Margin="0,100,0,12" ScrollViewer.HorizontalScrollBarVisibility="Disabled" DisplayMemberPath="name" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" HorizontalAlignment="Center" Width="275" /> 18 19 <TextBlock x:Name="Display" Grid.Column="2" HorizontalAlignment="Left" Margin="10,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="18"><Run Language="ja-jp" Text="name"/><LineBreak/><Run Language="ja-jp"/></TextBlock> 20 <TextBlock x:Name="DisplayBox" Grid.Column="1" HorizontalAlignment="Left" Margin="10,78,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="326" Height="46"/> 21 22 <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="10,122,0,0" TextWrapping="Wrap" Text="URL" VerticalAlignment="Top" FontSize="18"/> 23 <TextBlock x:Name="URLBox" Grid.Column="1" HorizontalAlignment="Left" Margin="10,151,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="39" Width="595"/> 24 25 <TextBlock HorizontalAlignment="Left" Margin="10,194,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="31" Width="116" FontSize="18" Grid.Column="1"><Run Language="ja-jp" Text="subname"/></TextBlock> 26 <ListBox x:Name="SubnameListBox" Margin="10,230,27,12" ScrollViewer.HorizontalScrollBarVisibility="Disabled" DisplayMemberPath="subname" ItemsSource="{Binding / manager_list}" Grid.Column="1" /> 27 28 </Grid> 29 30 </Grid> 31</Window> 32
C#
1// Copyright © 2022 Tsubasa co., Ltd. All rights reserved. 2using Microsoft.Win32; 3using Newtonsoft.Json; 4using System; 5using System.Collections.Generic; 6using System.Diagnostics; 7using System.IO; 8using System.Windows; 9using System.Windows.Controls; 10 11namespace ManagerEditor 12{ 13 /// <summary> 14 /// メイン画面 15 /// </summary> 16 public partial class MainWindow : Window 17 { 18 public MainWindow() 19 { 20 InitializeComponent(); 21 } 22 23 private void Window_Loaded(object sender, RoutedEventArgs e) 24 { 25 26 } 27 28 PersonalData[] _data; 29 30 31 //Jsonデータのデシリアライズ、格納 32 private void OpenButton_Click(object sender, RoutedEventArgs e) 33 { 34 var dialog = new OpenFileDialog(); 35 dialog.Filter = "json|*.json"; 36 if (dialog.ShowDialog().Value) 37 { 38 var file = dialog.FileName; 39 40 try 41 { 42 var reader = new StreamReader(file); 43 var data = reader.ReadToEnd(); 44 reader.Close(); 45 _data = JsonConvert.DeserializeObject<PersonalData[]>(data); 46 47 } 48 catch (Exception error) 49 { 50 if (error.Message != null) 51 Debug.WriteLine(error.Message); 52 } 53 54 if (_data != null) 55 { 56 DataContext = _data; 57 } 58 59 URLBox.Text = ""; 60 DisplayBox.Text = ""; 61 } 62 } 63 64 //グループ押下時の挙動設定 65 private void UnitNameListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 66 { 67 if (UnitnameListBox.SelectedItem == null) return; 68 69 PersonalData item = (PersonalData)UnitnameListBox.SelectedItem; 70 DisplayBox.Text = item.name; 71 URLBox.Text = item.url; 72 } 73 74 } 75 public class Manager 76 { 77 public string subname { get; set; } 78 public string address { get; set; } 79 } 80 81 public class PersonalData 82 { 83 public string name { get; set; } 84 public string url { get; set; } 85 public List<Manager> manager_list { get; set; } 86 } 87 88} 89
json
1[ 2 { 3 "name": "tora", 4 "url": "https:tora.com", 5 "manager_list": [ 6 { 7 "subname": "tiger", 8 "address": "chiba" 9 }, 10 { 11 "subname": "tiger2", 12 "address": "tokyo" 13 } 14 15 ] 16 }, 17 { 18 "name": "cat", 19 "url": "https:cat.com", 20 "manager_list": [ 21 { 22 "subname": "neko", 23 "address": "kanagawa" 24 }, 25 { 26 "subname": "neko2", 27 "address": "yokohama" 28 } 29 ] 30 } 31] 32



回答1件
あなたの回答
tips
プレビュー