質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

5973閲覧

C# WPFでボタンのenableが変化させられない

as00000

総合スコア21

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/01/20 02:35

編集2020/01/20 02:43

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を叩きに行く事にしました。

  

上記の変更でとりあえず望み通りに動いているのですが、
・変化のきっかけが多数ある時に、いちいち叩きに行かないとならないのか?
・バインドの機能があるのだから、もっとスマートなやり方がありそう・・・と
邪道感が否めません

  
・このやり方が一般的に許容されるやり方なのか?
・王道のやり方はこうです

など、をご指導頂ければと思い投稿しました
ご教授をお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

・変化のきっかけが多数ある時に、いちいち叩きに行かないとならないのか?

はい

・バインドの機能があるのだから、もっとスマートなやり方がありそう

MVVMインフラを使えば多少は負荷が軽減されると思います。
「書かないコードにバグは無い」ので、私はICommand, INotifyPropertyChangedの実装など自分では行いません。
何より自分で実装すると書かねばならない多くのドキュメントが[Prismを使ってます]などの一言で済みます。

投稿2020/01/20 03:18

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

as00000

2020/01/22 00:00

ご回答ありがとうございます。 とりあえず、方向として邪道側では無さそうで安心しました。 ずっとWindowsForms で自作ソフトを作っていたのですが それが時代遅れになっている事を最近知り WPF + C# + .NET Core の環境を現在勉強中です 最初なので、フレームワークなどのツールは使用しない方向で組んで 基本的な組み方を勉強し、その後それをツールに置き換える様にして 動きを理解したいと思っていました (正直、どれがWPFの純粋な機能で、どれがフレームワークの機能なのかも  理解できていない状態です。 ^^; ) Prismと言う存在は見かけた事がありますが、何に役立つのか知りませんでしたが 「[Prismを使ってます]などの一言で済む」 様な 便利かつ当たり前に使用される機能である事が分かりましたので 今後、それについても勉強し、使用して行きたいと思います
hihijiji

2020/01/23 08:14

既にWPFも時代遅れですから、せっかく新しく学ぶならもっと新しいものをお勧めします。 WPF と同じようにXAMLを使う Xamarin とか如何でしょう?
as00000

2020/02/03 07:29

ご返信をありがとうございます Xamarin ←聞いた事はあります。 調べてみましたがandroidアプリも出来る様ですし C# + XAML の構成も少し分かって来て、それが応用出来る感じなので 今、移植している物がとりあえず形になったら、次の移植はXamarinでTryしてみたいと思います (もたもたしてると直ぐに時代遅れの技術になるので、早めにやらないといけませんね ^^;) 度々のアドバイスをありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問