前提・実現したいこと
既存コードから諸変更して標題のような機能を追加したく思います。
・セルに入力した値が初期値から変更されていれば、変更したセルの背景色を黄色に変える。
・更新ボタンを押すと、現在値を初期値として更新する。この際背景色は通常色に戻る。
調べたこと、わからないこと、疑問
アプリでは何度かみたことがありますが、WindowsFormしか扱ったことがなく根本的に何から手を付けたらよいかわかりません。
コード作成者がすでに不在で既存部分も理解できていないため1から学習を始めるのですが、本件はすぐに対応が必要なため一時的にしのぎたいです。
①<Style Targettype ="DataGridCell"> 、
<DataTrigger Binding="{Binding 変化フラグ}" Value="true"}、
<Setter Property="Background" Value="Yellow"/>で変化があった場合のセルの背景を変えられそう。
→(疑問)DataTriggerっていつ反映される?
→(疑問)これだと背景を変えるセル(座標)が不明?参考サイトだと元々バインドされたプロパティが変化したときの例。
②CellEditEndingで値比較すれば変化フラグは作れそう。
③②のフラグをバインドする方法と、そもそも変化があったことをXAML側でどうやってセルを認識させられるのかわからない。
→(疑問)Contextでrecordsがバインドされているので変化フラグをどのようにバインドする?
該当のソースコード
XAML
1///元々のコードを抜粋 2<UserControl x:Name="userControl" x:Class="App.Program" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 7 xmlns:local="clr-namespace:lApp" 8 mc:Ignorable="d" 9 d:DesignHeight="300" d:DesignWidth="500"> 10 <Border Name="RightPain" BorderBrush="Navy" BorderThickness="2" CornerRadius="2" Margin="2,2,2,2"> 11 <Grid MinHeight="300" MinWidth="500"> 12 13 <Grid.RowDefinitions> 14 <RowDefinition /> 15 ... 16 </Grid.RowDefinitions> 17 18 <Grid.ColumnDefinitions> 19 <ColumnDefinition /> 20 .... 21 </Grid.ColumnDefinitions> 22 23 <DataGrid Name="Program" Grid.Row="0" Grid.Column="0" Grid.RowSpan="10" Grid.ColumnSpan="6" Margin="10,5,5,5" HorizontalAlignment="Left" 24 ItemsSource="{Binding Mode=OneWay}" AutoGenerateColumns="False" SelectionChanged="Program_SelectionChanged" IsEnabled="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" SelectedCellsChanged ="Program_SelectedCellsChanged" SelectionUnit="CellOrRowHeader" CellEditEnding="Program_CellEditEnding"> 25 <DataGrid.Columns> 26 <DataGridTextColumn Header="{Binding Source={x:Static local:ResourceService.Current},Path=Resources.ProgStep, Mode=OneWay}" Width="50" Binding="{Binding _a}" IsReadOnly="True"/> 27 <DataGridTextColumn Header="{Binding Source={x:Static local:ResourceService.Current},Path=Resources.Prog_a, Mode=OneWay}" Width="95" Binding="{Binding _b}"/> 28 <DataGridTextColumn Header="{Binding Source={x:Static local:ResourceService.Current},Path=Resources.Prog_b, Mode=OneWay}" Width="75" Binding="{Binding _c}"/> 29 <DataGridTextColumn Header="{Binding Source={x:Static local:ResourceService.Current},Path=Resources.Prog_c, Mode=OneWay}" Width="90" Binding="{Binding _d}"/> 30 </DataGrid.Columns> 31 32 <!-- サイトを見ている限りこんな感じで変えられる?--> 33 <DataGrid.CellStyle> 34 <Style TargetType="DataGridCell"> 35 <Style.Triggers> 36 <DataTrigger Binding="{Binding change_flag}" Value="true"> 37 <Setter Property="Background" Value="Yellow"/> 38 </DataTrigger> 39 </Style.Triggers> 40 </Style> 41 </DataGrid.CellStyle> 42 </DataGrid> 43 </Grid> 44 </Border> 45</UserControl>
C#
1/// ※元々のコード抜粋 2namespace App 3{ 4 /// <summary> 5 /// Program.xaml の相互作用ロジック 6 /// </summary> 7 public partial class Program : UserControl 8 { 9 List<Record> records = new List<Record>(); 10 bool _flag = false; 11 MainWindow parent; 12 13 public Program() 14 { 15 InitializeComponent(); 16 17 Programdata.programItem prgItem = new Programdata.programItem(); 18 19 for (int i = 0; i < 32; i++) 20 { 21 records.Add(new Record() 22 { 23 _a = i, 24 _b = prgItem.data_b, 25 _c = prgItem.data_c, 26 _d = prgItem.data_d, 27 }); 28 } 29 Program.DataContext = records; 30 Program.IsEnabled = true; 31 } 32 33 34 private void Program_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 35 { 36 if( セル初期値 != content = Int16.Parse(((TextBox)(cellInfo.Column.GetCellContent(cellInfo.Item))).Text) 37 { 38 ._flag = true; 39 }else{ 40 ._flag = false;} 41 } 42 private void Program_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e){...} 43 private void Program_SelectionChanged(object sender, SelectionChangedEventArgs e){...} 44 45 class ProgRecordGrp 46 { 47 public int _a { get; set; } 48 public UInt16 _b { get; set; } 49 public Int32 _c { get; set; } 50 public UInt16 _d { get; set; } 51 } 52 53 class Flag 54 { 55 public bool _flag{get;set;} 56 } 57}
試したこと
以下の様なサイトを閲覧
ttps://qiita.com/nkimra/items/0f15cfdb89757adfb25a
ttps://qiita.com/tera1707/items/7591889617efc69fcb95
補足情報(FW/ツールのバージョンなど)
VisualStudio 2015
.NET Franework 4.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/29 02:38