前提・実現したいこと
ReactivePropertyの勉強をしています。
ReactivePropertyでバリデーションを設定しているのですが、予め登録されているデータを編集ボタンでメモリ上の値をTextBoxに表示する動きを想定しているのですが、画面描画前に値を設定するとエラーになっていないはずがTextBoxが赤枠で表示されてしまいます。
使用環境
VisualStudio2019
.NETFramework4.7.2
ReactivePropertyv7.8.0
該当のソースコード
xaml
1<Window x:Class="ReactivePropertyTestApp.View.ValidationListWindow" 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:ReactivePropertyTestApp.View" 7 xmlns:vm="clr-namespace:ReactivePropertyTestApp.ViewModel" 8 mc:Ignorable="d" 9 Title="ValidationListWindow" Height="450" Width="800"> 10 11 <Window.DataContext> 12 <vm:ValidationListViewModel/> 13 </Window.DataContext> 14 15 <Grid> 16 <StackPanel> 17 <ListBox ItemsSource="{Binding TestListVM}"> 18 <ListBox.ItemTemplate> 19 <DataTemplate> 20 <TextBlock Text="{Binding Name}"/> 21 </DataTemplate> 22 </ListBox.ItemTemplate> 23 </ListBox> 24 <Button Content="追加" Click="Button_Click" Width="70" Height="30"/> 25 <Button Content="編集" Click="Button_Click_1" Width="70" Height="30"/> 26 </StackPanel> 27 </Grid> 28</Window>
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Shapes; 14 15namespace ReactivePropertyTestApp.View 16{ 17 /// <summary> 18 /// ValidationListWindow.xaml の相互作用ロジック 19 /// </summary> 20 public partial class ValidationListWindow : Window 21 { 22 public ValidationListWindow() 23 { 24 InitializeComponent(); 25 } 26 27 private void Button_Click(object sender, RoutedEventArgs e) 28 { 29 ValidationTestWindow validationTestWindow = new ValidationTestWindow(0); 30 validationTestWindow.ShowDialog(); 31 } 32 33 private void Button_Click_1(object sender, RoutedEventArgs e) 34 { 35 ValidationTestWindow validationTestWindow = new ValidationTestWindow(1); 36 validationTestWindow.ShowDialog(); 37 } 38 } 39}
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Collections.ObjectModel; 7 8using ReactivePropertyTestApp.Model; 9using Reactive.Bindings; 10 11namespace ReactivePropertyTestApp.ViewModel 12{ 13 class ValidationListViewModel 14 { 15 public ReadOnlyReactiveCollection<Test> TestListVM { get; } 16 17 public ValidationListViewModel() 18 { 19 TestListVM = TestData.Instance.TestList.ToReadOnlyReactiveCollection(); 20 } 21 } 22}
xaml
1<Window x:Class="ReactivePropertyTestApp.View.ValidationTestWindow" 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:ReactivePropertyTestApp.View" 7 xmlns:vm="clr-namespace:ReactivePropertyTestApp.ViewModel" 8 mc:Ignorable="d" 9 Title="ValidationTestWindow" Height="450" Width="800"> 10 11 <Window.DataContext> 12 <vm:ValidationTestWindowViewModel/> 13 </Window.DataContext> 14 15 <Grid> 16 <StackPanel VerticalAlignment="Center"> 17 <TextBox Width="200" Height="30" VerticalContentAlignment="Center" 18 Text="{Binding NameTextBox.Value,UpdateSourceTrigger=PropertyChanged}" 19 ToolTip="{Binding NameValidationErrorMessage.Value}"/> 20 <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 21 <Button Content="保存" Width="50" Height="30" Click="Button_Click"/> 22 <Button Content="入れ替え" Width="50" Height="30" Click="Button_Click_1"/> 23 24 </StackPanel> 25 </StackPanel> 26 </Grid> 27</Window>
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Shapes; 14 15using ReactivePropertyTestApp.ViewModel; 16 17namespace ReactivePropertyTestApp.View 18{ 19 /// <summary> 20 /// ValidationTestWindow.xaml の相互作用ロジック 21 /// </summary> 22 public partial class ValidationTestWindow : Window 23 { 24 private ValidationTestWindowViewModel viewModel; 25 26 public ValidationTestWindow(int pMode) 27 { 28 InitializeComponent(); 29 viewModel = this.DataContext as ValidationTestWindowViewModel; 30 if (pMode == 1) 31 { 32 viewModel.nameChange(); 33 } 34 } 35 36 private void Button_Click(object sender, RoutedEventArgs e) 37 { 38 viewModel.saveName(); 39 this.Close(); 40 } 41 42 private void Button_Click_1(object sender, RoutedEventArgs e) 43 { 44 viewModel.nameChange(); 45 } 46 } 47}
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7using Reactive.Bindings; 8using Reactive.Bindings.Extensions; 9 10using ReactivePropertyTestApp.Model; 11 12namespace ReactivePropertyTestApp.ViewModel 13{ 14 class ValidationTestWindowViewModel : ViewModelBase 15 { 16 [NameValidation] 17 public ReactiveProperty<string> NameTextBox { get; set; } 18 public ReadOnlyReactivePropertySlim<string> NameValidationErrorMessage { get; } 19 20 public ValidationTestWindowViewModel() 21 { 22 NameTextBox = new ReactiveProperty<string>().SetValidateAttribute(() => NameTextBox).AddTo(Disposables); 23 NameValidationErrorMessage = NameTextBox.ObserveValidationErrorMessage().ToReadOnlyReactivePropertySlim(); 24 } 25 26 public void nameChange() 27 { 28 NameTextBox.Value = TestData.Instance.TestList[0].Name; 29 } 30 31 public void saveName() 32 { 33 TestData.Instance.TestList.Add(new Test() { Name = NameTextBox.Value }); 34 } 35 } 36}
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel.DataAnnotations; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace ReactivePropertyTestApp.Model 9{ 10 class NameValidationAttribute : ValidationAttribute 11 { 12 protected override ValidationResult IsValid(object value, ValidationContext validationContext) 13 { 14 var inputValue = value as string; 15 ErrorMessage = string.Empty; 16 17 if (string.IsNullOrWhiteSpace(inputValue) == true) 18 { 19 return new ValidationResult("値を入力してください。"); 20 } 21 22 if (inputValue.Count() > 8) 23 { 24 ErrorMessage = $"8文字以内で入力してください。"; 25 } 26 27 if (string.IsNullOrEmpty(ErrorMessage) == true) 28 { 29 return ValidationResult.Success; 30 } 31 else 32 { 33 return new ValidationResult(ErrorMessage); 34 } 35 } 36 } 37}
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ReactivePropertyTestApp.Model 8{ 9 class Test : BindableBase 10 { 11 private string name; 12 public string Name 13 { 14 get { return name; } 15 set { SetProperty(ref name, value); } 16 } 17 } 18}
追加されているものを選択して編集ボタンを押すと
正常な値が入力されているが赤枠になってしまう。
ToolTipには何も表示されない。
不足している情報があればご指摘ください。
試したこと
NameTextBoxのHasErrorは値セット後falseになっていることは確認出来ました。
下記URLが似ている内容っぽいのですがコードが確認出来ないのと、内容があまり理解できていません。
https://github.com/runceel/ReactiveProperty/issues/85
この方法なら赤枠が表示されなくなる等の情報をお持ちでしたらご教示いただけないでしょうか。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/22 01:27
2021/04/22 04:20
2021/04/22 05:01
2021/04/22 05:20
2021/04/23 00:39
2021/04/23 04:36
2021/04/23 05:53
2021/04/23 07:14
2021/04/23 11:57
2021/04/23 12:24
2021/04/24 10:02 編集
2021/04/26 00:18
2021/04/26 01:58
2021/04/26 02:59
2021/04/26 04:18
2021/04/26 08:28
2021/04/26 09:34
2021/04/26 13:46
2021/04/27 01:34
2021/04/27 02:08
2021/05/02 07:41