WPFで、行にボタンを追加し、上の行と同じ内容を挿入したい(行番号を取得したい)
WPF「ObservableCollection」「INotifyCollectionChanged」「Class」が良く分からない
https://teratail.com/questions/1ypxtzrjzwnam0
上記リンクと似たような事がしたかったのですが、
良く分からないため質問させてください。ソースもお借りしました。
前提・実現したいこと
●ボタン列をクリックしたときに、行番号を取得したい
・「追加」列のボタンを押したら、1行上の行をコピーし挿入したい
「画像ファイル」「タイトル」「詳細」を結合させたい(できたらレベルの話なので、出来なくても問題ない)
・「削除」列のボタンを押したら、警告を出した後 行を削除したい
●別のxamlで色を選択したいが、子ウィンドウへと親ウィンドウの文字色受け渡しが分からない
・そもそも「Button」にする必要はあったのか…(Webで使える色名を選択できるようにしたかった)
DataGridへのCombobox選択も良いかと思ったのですが、操作性が良くなさそうなのと
WPF初心者な自分には難しそうだったので、別ウィンドウで表示して選択させるようにしようと思いました。
ですが、親フォームにある色を子フォームに持っていく方法・子から親に持っていく方法が分かりません。
該当のソースコード
親
xaml
1<Window x:Class="nya_3.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:nya_3" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition /> 12 <RowDefinition Height="Auto" /> 13 </Grid.RowDefinitions> 14 15 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}"> 16 <DataGrid.Columns> 17 <DataGridTextColumn Binding="{Binding Mypic}" Header="画像ファイル" /> 18 <DataGridTextColumn Binding="{Binding Title}" Header="タイトル" /> 19 <DataGridTextColumn Binding="{Binding Detail}" Header="詳細" /> 20 <DataGridTemplateColumn Header="色"> 21 <DataGridTemplateColumn.CellTemplate> 22 <DataTemplate> 23 <Button Content="White" Click="Color_Click" Background="White"/> 24 </DataTemplate> 25 </DataGridTemplateColumn.CellTemplate> 26 </DataGridTemplateColumn> 27 <DataGridTextColumn Header="次リンク" Binding="{Binding Nextlink}" /> 28 <DataGridTemplateColumn Header="追加"> 29 <DataGridTemplateColumn.CellTemplate> 30 <DataTemplate> 31 <Button Content="+" Click="Add_Click" Tag="{Binding}" Background="White" /> 32 </DataTemplate> 33 </DataGridTemplateColumn.CellTemplate> 34 </DataGridTemplateColumn> 35 <DataGridTemplateColumn Header="削除"> 36 <DataGridTemplateColumn.CellTemplate> 37 <DataTemplate> 38 <Button Content="-" Click="Del_Click" Tag="{Binding}" Background="White"/> 39 </DataTemplate> 40 </DataGridTemplateColumn.CellTemplate> 41 </DataGridTemplateColumn> 42 </DataGrid.Columns> 43 </DataGrid> 44 45 <UniformGrid Grid.Row="1" HorizontalAlignment="Center" Rows="1"> 46 <Button Margin="10" Click="SaveButton_Click" Content="Save" /> 47 <Button Margin="10" Click="LoadButton_Click" Content="Load" /> 48 <Button Margin="10" Click="AddButton_Click" Content="Add" /> 49 </UniformGrid> 50 </Grid> 51</Window> 52
C#
1using System; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using System.IO; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8using System.Windows; 9using System.Windows.Controls; 10using System.Windows.Data; 11using System.Windows.Documents; 12using System.Windows.Input; 13using System.Windows.Media; 14using System.Windows.Media.Imaging; 15using System.Windows.Navigation; 16using System.Windows.Shapes; 17using System.Xml.Serialization; 18 19namespace nya_3 20{ 21 /// <summary> 22 /// MainWindow.xaml の相互作用ロジック 23 /// </summary> 24 public partial class MainWindow : Window 25 { 26 27 public class Item 28 { 29 [XmlAttribute] public string Mypic { get; set; } 30 [XmlAttribute] public string Title { get; set; } 31 [XmlAttribute] public string Detail { get; set; } 32 [XmlAttribute] public string Nextlink { get; set; } 33 [XmlAttribute] public bool Isedit { get; set; } 34 35 } 36 37 public ObservableCollection<Item> Items { get; private set; } = new ObservableCollection<Item>(); 38 public MainWindow() 39 { 40 InitializeComponent(); 41 Items.Add(new Item { Mypic = "1.jpeg", Title = "タイトル1", Detail = "詳細1", Nextlink="2.jpeg", }); 42 Items.Add(new Item { Mypic = "2.jpeg", Title = "タイトル2", Detail = "詳細2", Nextlink = "1.jpeg" ,}); 43 Items.Add(new Item { Mypic = "3.jpeg", Title = "タイトル3", Detail = "詳細3", Nextlink = "3.jpeg", }); 44 DataContext = Items; 45 } 46 47 private void SaveButton_Click(object sender, RoutedEventArgs e) 48 { 49 var serializer = new XmlSerializer(Items.GetType()); 50 using (var fs = new FileStream("mydata.xml", FileMode.Create)) 51 serializer.Serialize(fs, Items); 52 } 53 54 private void LoadButton_Click(object sender, RoutedEventArgs e) 55 { 56 57 var serializer = new XmlSerializer(Items.GetType()); 58 using (var fs = new FileStream("mydata.xml", FileMode.Open)) 59 { 60 Items = (ObservableCollection<Item>)serializer.Deserialize(fs); 61 62 // Items自体の変更は通知されないので明示的に入れ替え 63 // INotifyPropertyChangedを実装するか、Clear・Addするか 64 DataContext = null; 65 DataContext = Items; 66 } 67 } 68 69 private void AddButton_Click(object sender, RoutedEventArgs e) 70 { 71 Items.Add(new Item {Isedit = true, }); 72 } 73 74 private void Add_Click(object sender, RoutedEventArgs e) 75 { 76 Console.WriteLine((((Button)sender).Tag as Item).Title); 77 //クリックした行と部分的に同じものを、1つ下の行に挿入したい 78 Items.Insert(1, new Item { Title = $"タイトル{1}", Detail = $"詳細{1}", }); 79 //やり方が分からなかったため、とりあえず1行目の下にInsert 80 } 81 82 private void Del_Click(object sender, RoutedEventArgs e) 83 { 84 //クリックした行を削除したい 85 Console.WriteLine((((Button)sender).Tag as Item).Title); 86 //やり方は不明 87 } 88 } 89} 90
子ウィンドウ
xaml
1<Window x:Class="nya_3.ColorSelectWin" 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:nya_3" 7 mc:Ignorable="d" 8 Title="ColorSelectWin" Height="180" Width="300"> 9 <Grid> 10 <StackPanel Orientation="Vertical"> 11 <StackPanel Orientation="Horizontal" Height="30"> 12 <Button Content="1" Width="30" Background="black"></Button> 13 <Button Content="1" Width="30" Background="darkslategray"></Button> 14 <Button Content="1" Width="30" Background="slategray"></Button> 15 <Button Content="1" Width="30" Background="lightslategray"></Button> 16 <Button Content="1" Width="30" Background="dimgray"></Button> 17 <Button Content="1" Width="30" Background="gray"></Button> 18 <Button Content="1" Width="30" Background="darkgray"></Button> 19 <Button Content="1" Width="30" Background="silver"></Button> 20 <Button Content="1" Width="30" Background="lightgray"></Button> 21 <Button Content="1" Width="30" Background="gainsboro"></Button> 22 </StackPanel> 23 <StackPanel Orientation="Horizontal" Height="30"> 24 <Button Content="1" Width="30" Background="white"></Button> 25 <Button Content="1" Width="30" Background="mintcream"></Button> 26 <Button Content="1" Width="30" Background="azure"></Button> 27 <Button Content="1" Width="30" Background="aliceblue"></Button> 28 <Button Content="1" Width="30" Background="ghostwhite"></Button> 29 <Button Content="1" Width="30" Background="whitesmoke"></Button> 30 <Button Content="1" Width="30" Background="seashell"></Button> 31 <Button Content="1" Width="30" Background="beige"></Button> 32 <Button Content="1" Width="30" Background="lavenderblush"></Button> 33 <Button Content="1" Width="30" Background="mistyrose"></Button> 34 </StackPanel> 35 <StackPanel Orientation="Horizontal" Height="30"> 36 <Button Content="1" Width="30" Background="orangered"></Button> 37 <Button Content="1" Width="30" Background="darkorange"></Button> 38 <Button Content="1" Width="30" Background="red"></Button> 39 <Button Content="1" Width="30" Background="tomato"></Button> 40 <Button Content="1" Width="30" Background="coral"></Button> 41 <Button Content="1" Width="30" Background="gold"></Button> 42 <Button Content="1" Width="30" Background="yellow"></Button> 43 <Button Content="1" Width="30" Background="lightyellow"></Button> 44 <Button Content="1" Width="30" Background="violet"></Button> 45 <Button Content="1" Width="30" Background="pink"></Button> 46 </StackPanel> 47 </StackPanel> 48 </Grid> 49</Window>
※文字数のため、SlackPanelを2行分削除
試したこと
調べると「e.RowIndex」というので取得できそうだと思ったのですが、
e.と入力した後の候補に出てこないため利用できないと判断しました。
DataTableを利用していたら可能なもの?なのかもしれません。
ググッても見つかりませんでした…。
補足情報(FW/ツールのバージョンなど)
.Net FrameWork 4.7.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/14 15:09
2022/03/30 01:36