C# WPF .NETCore3.0 で
テキストボックスから入力されるcodeの内容が正しければ
ボタンが押せる様になり、ボタンを押すとDataGridの内容を変更させる
プログラムを作っています
ボタンは下記の様に配置しています
MainWindow.xaml
xaml
1<Button 2 x:Name="btn_refresh_info" 3 Grid.Row="3" 4 Grid.Column="4" 5 Command="{Binding RefreshDataGrid}" 6 Content="{StaticResource string_refresh_info}" /> 7
ボタン押下時のコマンドはViewModelに記述しています
Project.cs
C#
1public class Project : INotifyPropertyChanged 2 { 3 public ICommand RefreshDataGrid { get; set; } **←これをボタンのコマンドにバインドしています** 4 5 public Project() 6 { 7 refreshInfoCommand = new RefreshInfoCommand(this, new DataOperator()); 8 RefreshDataGrid = refreshInfoCommand; 9 } 10 11 private string code; 12 public string Code 13 { 14 get 15 { return code; } 16 17 set 18 { 19 **※このcodeが書き換えられたら、RefreshDataGridクラスの"CanExecute"が実行され 20 codeの内容によってボタンのenableを変更される様にしたい** 21 22 code = value; 23 NotifyPropertyChanged("Code"); 24 NotifyPropertyChanged("CodeAndName"); 25 26 } 27 } 28 }
ボタンに紐づけているコマンドの中身は下記の通りです
RefreshInfoCommand.cs
C#
1 2 internal class RefreshInfoCommand : ICommand 3 { 4 5 private readonly Project vm; 6 private readonly DataOperator dataOperator; 7 8 public RefreshInfoCommand(Project viewmodel, DataOperator dataOperator) 9 { 10 this.vm = viewmodel; 11 this.dataOperator = dataOperator; 12 13 } 14 15 16 public bool CanExecute(object parameter) 17 { 18 if ((vm.Code != "") && (int.TryParse(vm.Code, out int _))) 19 { 20 return true; 21 } 22 return false; 23 24 } 25 26 public void Execute(object parameter) 27 { 28 29 GetDataGridData(); 30 OutputDataGridData(); 31 32 } 33 34 private void GetDataGridData() 35 { 36 *** 省略 *** 37 } 38 39 private void OutputDataGridData() 40 { 41 *** 省略 *** 42 } 43 44 } 45
上記の様にコードを記述しましたが
起動時にcodeが""で立ち上がり、ボタンが押せない状態で起動し(これは想定通りの動作)
textboxからcodeを入力しますが、ボタンの使用可否が変化しませんでした
仕方がないのでRefreshInfoCommand.cs
に
public void RaiseCanExecuteChanged() { CanExecuteChanged?.Invoke(this, new EventArgs()); }
を追加し、(Project.cs内からCanExecuteChangedを叩こうとするとエラーになり、叩けませんでした)
Project.cs
の
public string Codeのset内に
refreshInfoCommand.RaiseCanExecuteChanged();
として、自力で CanExecuteChangedを叩きに行く事にしました。
上記の変更でとりあえず望み通りに動いているのですが、
・変化のきっかけが多数ある時に、いちいち叩きに行かないとならないのか?
・バインドの機能があるのだから、もっとスマートなやり方がありそう・・・と
邪道感が否めません
・このやり方が一般的に許容されるやり方なのか?
・王道のやり方はこうです
など、をご指導頂ければと思い投稿しました
ご教授をお願いします

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/22 00:00
2020/01/23 08:14
2020/02/03 07:29