前提・実現したいこと
WPF/Livetを使ってDataGridを使った顧客情報と関連設定を操作するアプリを作っています。
MVVMの設計思想にて進めている初心者です。
今回、「対象No」という値に関してのみ、ユーザーに変更可能な項目として設定。
入力されたときにエラーの場合、データ更新ボタンを押せないようにしようと考えています。
ReactivePropertyを導入するとエラーチェックが簡単にできると調べて分かり導入しましたが、エラー状態を取得できずに困っています。
ReactivePropertyを使用しなくても、エラー状態を監視し、ボタンをOFFに出来る簡単な方法があるなら、それも知りたいです。
よろしくお願いいたします。
発生している問題
Numの入力エラー状態を取得できずに、ButoonをOFFに出来ない
適用ボタンを押した際でも良いので、エラー時にはメッセージを出すようにしたいがエラー自体がキャッチできないので、それも出来ない。
C#
1 var ret = val.Num.HasErrors;//エラーがある場合、Trueになることが期待値
該当のソースコード
App.xaml
xaml
1 <Application.Resources> 2 <Style x:Key="errorStyleLostFocus" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" > 3 <Style.Triggers> 4 <Trigger Property="Validation.HasError" Value="True"> 5 <Setter Property="Background" Value="Red"/> 6 </Trigger> 7 </Style.Triggers> 8 </Style> 9 <Style x:Key="errorStyleGotFocus" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" > 10 <Style.Triggers> 11 <Trigger Property="Validation.HasError" Value="True"> 12 <Setter Property="Background" Value="Red"/> 13 </Trigger> 14 </Style.Triggers> 15 </Style> 16 </Application.Resources>
View
xaml
1 <Window.DataContext> 2 <vm:MainWindowVM/> 3 </Window.DataContext> 4 <Grid> 5 <Grid.RowDefinitions> 6 <RowDefinition Height="9.5*"/> 7 <RowDefinition Height="1*"/> 8 </Grid.RowDefinitions> 9 <TabControl Height="410" VerticalAlignment="Top"> 10 <TabItem Header="顧客"> 11 <DataGrid x:Name="clientData" ItemsSource="{Binding ClientData}" IsReadOnly="False" AutoGenerateColumns="False" CanUserAddRows="False"> 12 <DataGrid.Columns> 13 <DataGridTextColumn Header="ID" Binding="{Binding ID}" IsReadOnly="True" /> 14 <DataGridTextColumn Header="名前" Binding="{Binding Name}" IsReadOnly="True" /> 15 <DataGridTextColumn Header="対象No" Binding="{Binding Num.Value}" IsReadOnly="False" /> 16 <DataGridTextColumn Header="備考" Binding="{Binding Other}" IsReadOnly="True" EditingElementStyle="{StaticResource errorStyleGotFocus}"/> 17 </DataGrid.Columns> 18 </DataGrid> 19 </TabItem> 20 </TabControl> 21 <Button Grid.Row="1" x:Name="DataUpdata" Content="データ更新" HorizontalAlignment="Left" IsEnabled="{Binding IsEnable}" VerticalAlignment="Center" Width="75" RenderTransformOrigin="1.202,0.058" Height="29"> 22 <i:Interaction.Triggers> 23 <i:EventTrigger EventName="Click"> 24 <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="UpdataButton"/> 25 </i:EventTrigger> 26 </i:Interaction.Triggers> 27 </Button> 28 </Grid>
ViewModel
C#
1 class MainWindowVM : ViewModel 2 { 3 private ObservableCollection<ClientInfo> _clientData; 4 public ObservableCollection<ClientInfo> ClientData 5 { 6 get 7 { 8 return _clientData; 9 } 10 set 11 { 12 _clientData = value; 13 RaisePropertyChanged(nameof(ClientInfo)); 14 } 15 } 16 17 private ObservableCollection<bool> _IsEnable; 18 public ObservableCollection<bool> IsEnable 19 { 20 get 21 { 22 return _IsEnable; 23 } 24 set 25 { 26 _IsEnable = value; 27 RaisePropertyChanged(nameof(IsEnable)); 28 } 29 } 30 31 /// <summary> 32 /// コンストラクタ 33 /// </summary> 34 public MainWindowVM() 35 { 36 ClientData = new ObservableCollection<ClientInfo>(); 37 38 ReactiveProperty<double> reactive = new ReactiveProperty<double>(); 39 reactive.Value = 1.1; 40 ClientData.Add(new ClientInfo { ID = 1, Name = "クライアント1", Num = reactive, Other = "" }); 41 ClientData.Add(new ClientInfo { ID = 50, Name = "クライアント2", Num = reactive, Other = "" }); 42 ClientData.Add(new ClientInfo { ID = 100, Name = "クライアント3", Num = reactive, Other = "" }); 43 ClientData.Add(new ClientInfo { ID = 999, Name = "クライアント4", Num = reactive, Other = "" }); 44 } 45 46 /// <summary> 47 /// 更新ボタン押下 48 /// </summary> 49 public void UpdataButton() 50 { 51 foreach(var val in ClientData) 52 { 53 var ret = val.Num.HasErrors;//エラーがある場合、Trueになることが期待値 54 } 55 } 56 }
Model
C#
1 class ClientInfo:ViewModel 2 { 3 private ReactiveProperty<double> _num; 4 5 public int ID { get; set; } 6 public string Name { get; set; } 7 public ReactiveProperty<double> Num 8 { 9 get 10 { 11 return _num; 12 } 13 set 14 { 15 _num = value; 16 RaisePropertyChanged(nameof(Num)); 17 } 18 } 19 public string Other { get; set; } 20 }
試したこと
- Viewのエラー時の表示
https://thinkami.hatenablog.com/entry/2014/07/17/060723
- ReactivePropertyを使ったエラーチェック
https://teratail.com/questions/346500
補足情報(FW/ツールのバージョンなど)
VisualStudio2019
利用フレームワーク
.Net4.7.2
Livet3.0
ReactiveProperty
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/14 08:23
2021/10/14 08:35
2021/10/14 08:47 編集
2021/10/14 09:03