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

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

新規登録して質問してみよう
ただいま回答率
85.35%
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

3316閲覧

ReactiveCommandで戻り値のあるメソッドを呼び出し、その結果を取得したい

as00000

総合スコア21

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2020/06/17 05:20

前提・実現したいこと

Xamarin + Prism で
Windows.Storage.Pickers.FolderPicker を使用して
フォルダを選択し、その戻り値のstringを取得したいと思っていますが

ReactiveCommandでメソッドを呼び出し
メソッドから戻り値を取得する方法が分かりません

該当のソースコード

DirectorySettingPageViewModel.cs(共通側)

C#

1 public class DirectorySettingPageViewModel : BindableBase, IDisposable 2 { 3 private CompositeDisposable Disposable { get; } = new CompositeDisposable(); 4 public void Dispose() => this.Disposable.Dispose(); 5 6 public DirectoryPath DirectoryPath { get; } 7 public IDataOperator DataOperator { get; } 8 9 // コマンド 10 public ReactiveCommand<string> CallFileOpenPickerCommand { get; private set; } 11 = new ReactiveCommand<string>(); // フォルダを開く 12 13 14 15 16 public DirectorySettingPageViewModel(IDirectoryPath directoryPath, IDataOperator dataOperator) 17 { 18 this.DirectoryPath = (DirectoryPath)directoryPath; 19 this.DataOperator = dataOperator; 20 21       string forlderName; 22 CallFileOpenPickerCommand.Subscribe 23 (async x => await this.DataOperator.CallFileOpenPickerAsync()); 24 // ↑この「CallFileOpenPickerAsync」で返したstringをforlderNameで受けてviewに表示したい 25 26 } 27 28 } 29

DataOperatorUWP.cs(UWP側)

C#

1 public async Task<string> CallFileOpenPickerAsync() 2 { 3 var folderPicker = new Windows.Storage.Pickers.FolderPicker(); 4 folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop; 5 folderPicker.FileTypeFilter.Add("*"); 6 7 Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync(); 8 9 return folder.Path; ←ここでフォルダ名を返しています 10 11 } 12

色々検索しましたが、解決策を発見出来ませんでした。
どなたかご教示下さい

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

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

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

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

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

Zuishin

2020/06/17 05:33 編集

コマンドパターンに戻り値はありません。コマンドを送ったうえでその反応となるイベントを待ちます。ReactiveCommand はオブザーバーパターンとも統合されているので、メソッドチェーンで取得するのが良いと思います。
as00000

2020/06/17 06:45

ご回答ありがとうございます。 戻り値を、直接取得する事は出来ないのですね。 まだ初心者な為 「ReactiveCommand はオブザーバーパターンとも統合されているので、メソッドチェーンで取得する」 の具体的な方法が分からないのですが、 ・コマンド実行→フォルダを選択させる→選択の完了を通知(引数と共に)→通知時の引数(eとか?)を取得しReactivePropertyに反映させる という様な感じでしょうか? 度々の質問で申し訳ありませんが、回答頂けると幸いです
Zuishin

2020/06/17 07:43

よく読むと、質問と聞きたいことがずれているように思います。本当に聞きたいのは、ViewModel から View を操作する方法ではありませんか?
as00000

2020/06/17 07:52

度々申し訳ありません。 ViewModel と View の接続はReactivePropertyを使ってxamlでのbindingで変化させています 今回もFolderPickerで取得した文字をReactivePropertyに設定したいのですが FolderPickerを起動する為にコマンドが必要→コマンドで起動したメソッドから戻り値を取得出来ない で悩んでいます。 (この回答もズレていましたら、すいません)
Zuishin

2020/06/17 07:56

CallFileOpenPickerAsync が正しい値を返さないという意味ですか?
as00000

2020/06/17 08:00

本当に申し訳ありません^^; CallFileOpenPickerAsyncは string を返しますが その戻り値を"ドコでどの様にして受け取ったら良いのか"が分からない状態です
Zuishin

2020/06/17 08:06 編集

> CallFileOpenPickerCommand.Subscribe > (async x => await this.DataOperator.CallFileOpenPickerAsync()); これは次のものと同じです。 CallFileOpenPickerCommand.Subscribe(async _ => { await this.DataOperator.CallFileOpenPickerAsync(); }); 次のように受け取ればいいのではないでしょうか。 CallFileOpenPickerCommand.Subscribe(async _ => { string result = await this.DataOperator.CallFileOpenPickerAsync(); Debug.WriteLine(result); }); Debug.WriteLine の代わりに ViewModel の string 型のプロパティに入れれば、PropertyChanged イベントで View に通知できるよう作れると思います。
as00000

2020/06/17 09:48

私の文章・語彙が拙いためにご迷惑をお掛けし申し訳ありません。 内容は何となく理解できました。 帰宅してしまい、明日から休みになってしまう為、 後日、ご教示頂いた方法に書き直してみて、結果をご連絡します。 本当に何度もありがとうございました
as00000

2020/06/19 04:12

遅くなり、申し訳ありませんでした 教えて頂いた通りに書き直して、やりたい事が実現できました。 ラムダ式の記述方法がまだ見様見真似な為、この書き方にたどり着けませんでした。 ラムダ式の記述方法をまだまだ勉強する必要があるな と実感しました。 ちなみに、「回答」の形で返信頂いていないので ベストアンサー設定が出来ないのですが、どうしたら良いでしょう? (自己解決ではないので・・・)
Zuishin

2020/06/19 08:14

自己解決でいいと思います。具体的にどうしたのかを回答してください。
guest

回答1

0

自己解決

Zuishinさんに教えて頂いた


Zuishin 2020/06/17 17:05 編集

CallFileOpenPickerCommand.Subscribe
(async x => await this.DataOperator.CallFileOpenPickerAsync());

これは次のものと同じです。

CallFileOpenPickerCommand.Subscribe(async _ =>
{
await this.DataOperator.CallFileOpenPickerAsync();
});

次のように受け取ればいいのではないでしょうか。

CallFileOpenPickerCommand.Subscribe(async _ =>
{
string result = await this.DataOperator.CallFileOpenPickerAsync();
Debug.WriteLine(result);
});

Debug.WriteLine の代わりに ViewModel の string 型のプロパティに入れれば、PropertyChanged イベントで View に通知できるよう作れると思います。


の通りに書き直して、やりたい事が実現出来ました。
(ラムダ式の右辺は関数名か1行の処理しか書けないと思っていました)

ありがとうございました。

投稿2020/06/19 09:03

as00000

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問