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

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

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

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

WPF

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

Q&A

解決済

2回答

8393閲覧

WPFで、コントロールを変数(string)で指定する方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

1クリップ

投稿2016/09/23 10:43

編集2016/09/23 11:29

###やりたいこと、質問
Stringなどの変数でコントロールを指定し、そのプロパティを書き換えることがしたいのですが
調べる限りではWindowsFormでの記載はあっても、WPF上ではやり方がわかりませんでした。

以下のコードでは、button0とbutton1をクリックしたとき同じイベントを呼び出して
押したボタンのNameから操作したいコントロールのNameを表す文字列を作り出し
その文字列でコントロールを指定して操作するといったことを期待していますが、もちろんコンパイルエラーです。

WPF上でこのような処理をさせることはできないのでしょうか?
方法がありましたらご教授のほどよろしくお願いいたします。

###該当のソースコード

C#

1using System.Windows; 2using System.Windows.Controls; 3 4namespace HogeHoge 5{ 6 public partial class MainWindow : Window 7 { 8 public MainWindow() 9 { 10 InitializeComponent(); 11 } 12 13 public void TextBlockChange(string ChangeTo , string TextBlockName) 14 { 15 Controls[TextBlockName].Text = ChangeTo;//FormではできてもWPFではできない…? 16 } 17 18 private void button_Click(object sender, RoutedEventArgs e) 19 { 20 string ButtonName = (((Button)sender).Name); 21 ButtonName = ButtonName.Replace("button", "textBlock"); 22 23 TextBlockChange("Cahenged", ButtonName); 24 } 25 } 26}
<Window <!--省略--> > <Grid> <Button x:Name="button0" Click="button_Click" -省略- /> <Button x:Name="button1" Click="button_Click" -省略- /> <TextBlock x:Name="textBlock0" Text="TextBlock0" -省略- /> <TextBlock x:Name="textBlock1" Text="TextBlock1" -省略- /> </Grid> </Window>

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

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

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

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

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

guest

回答2

0

ベストアンサー

ViewModelクラスにCommandを持たせるサンプルコードを記載します。

準備として、DelegateCommandクラスを作ります。
このクラスはWeb上にサンプルが多く存在するクラスになりますが、
ICommandインターフェイスを実装したクラスを作るための補助クラスです。
別に使わなくてもICommand実装クラスが作れるならば必要ありませんが今回はこのクラスを利用したサンプルとしています。

C#

1 public class DelegateCommand : ICommand 2 { 3 private Action<object> _executeAction; 4 private Func<object, bool> _canExecuteAction; 5 6 public DelegateCommand(Action<object> executeAction, Func<object, bool> canExecuteAction) 7 { 8 _executeAction = executeAction; 9 _canExecuteAction = canExecuteAction; 10 } 11 12 #region ICommand メンバ 13 14 public bool CanExecute(object parameter) 15 { 16 return _canExecuteAction(parameter); 17 } 18 19 public event EventHandler CanExecuteChanged 20 { 21 add { CommandManager.RequerySuggested += value; } 22 remove { CommandManager.RequerySuggested -= value; } 23 } 24 25 public void Execute(object parameter) 26 { 27 _executeAction(parameter); 28 } 29 30 #endregion 31 }

次にViewModelとなるSampleViewModelクラスを作成します。必要最小限の内容にしています。

C#

1 public class SampleViewModel 2 { 3 public ICommand SampleCommand 4 { 5 get 6 { 7 return _sampleCommand; 8 } 9 } 10 11 private ICommand _sampleCommand = new DelegateCommand(o => 12 { 13 var txtBlock = o as TextBlock; 14 txtBlock.Text = "Cahenged"; 15 }, o => true); 16 }

ViewとなるWindowクラスのXAMLは以下の通りです。

<Window <!--省略-->> <Window.DataContext> <local:SampleViewModel /> </Window.DataContext> <Grid> <Button x:Name="button0" Command="{Binding SampleCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=textBlock0}" <!--省略--> /> <Button x:Name="button1" Command="{Binding SampleCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=textBlock1}" <!--省略--> /> <TextBlock x:Name="textBlock0" Text="TextBlock0" <!--省略--> /> <TextBlock x:Name="textBlock1" Text="TextBlock1" <!--省略--> /> </Grid> </Window>

View側に用意していたbutton_Click等のコードは不要になります。

投稿2016/09/24 08:20

nakit

総合スコア410

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

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

退会済みユーザー

退会済みユーザー

2016/09/24 09:26

望んだ処理にはできましたが、まだまだ理解が追いつきません。 浅学を痛感しました。 考えていた以上に複雑なコードが必要だと知り驚きです。 時間がかかりそうですが、示して頂いたコードを1つ1つ理解していこうと思います。 本当にありがとうございました。
guest

0

いくつか方法があるかと思います。
少なくともVisualTreeを辿る方法で実現はできるでしょう。

ただ、今回の例であれば自分なら ViewModel 側にCommandを用意してCommandParameterとして対象のTextBlockを渡すかなと思います。

投稿2016/09/23 15:41

nakit

総合スコア410

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

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

退会済みユーザー

退会済みユーザー

2016/09/24 05:57

返信遅くなりました。 WPFのCommandについて調べてみましたが、いまいち理解が及びません。 Commandに関する範囲が広く、どのあたりを調べればいいのか困っています。 あまり良くないことだとは思いますが、今回の処理では具体的にどのようにCommandを使えばいいのか教えて頂けませんでしょうか。 検索ワードも分からない状態です。よろしくお願いいたします。
nakit

2016/09/24 08:14

キーワード的には「MVVMパターン」「ICommand」「DelegateCommand」あたりでしょうか。 MVVMパターンをすぐに理解するのは困難だと思われますが、今回のように簡単なものから実装することで理解が進むかと思います。 WPFでは理想を言えばView側にロジックを持たさずに全てBindingだけで済ませられると良いのですが、なかなかそう上手くいかないことが多いです。 またMVVMパターンでのコーディングを補助するライブラリがたくさん出ています(最近追っていませんので古い情報かも知れませんが、Livet、MVVM Light Toolkit, Prismなどのことです)。慣れてくるとそれらを利用するのも良いでしょう。※というか使いたくなるはずです。 サンプルコードも用意しましたが長くなるので別の回答として載せたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問