🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

WPF

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

Q&A

解決済

2回答

4811閲覧

DialogResultConverter

Zuishin

総合スコア28669

C#

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

WPF

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

0グッド

3クリップ

投稿2019/11/24 11:55

ちょっと調べ物をしていたら、System.Windows.DialogResultConverter というのをみつけました。Windows Forms の DialogResult と WPF の DialogResult は異なるので、それを変換するものか、それとも文字列と bool? を変換するものかと、ソースを覗いてみて二度見しました。

DialogResultConverter.cs

これは一体何に使うものなんでしょうか?
Google で検索してもヒットしません。どなたかご存知の方はいらっしゃいますか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

GitHubでもこのパターンの使用例しかないですね。

cs

1[TypeConverter(typeof(DialogResultConverter))] 2public Nullable<bool> DialogResult { get; set; }

理由は想像ですけど「xaml上で値を設定されたくないから、わざとエラーになるようにしている」ってことじゃないでしょうか?
We don't support 以外に、whyも書いといてほしいですね。

試しにxaml上でDialogResult="True"と指定した場合、

DialogResult プロパティは、マークアップで設定したり、文字列にシリアル化することはできません。

のようなエラーが出ました。SRID.CantSetInMarkupに対応しているように思えます。

しかし、DialogResult="{x:Null}"とすると別のエラーになりました。

Window を作成し、ダイアログとして表示した後でのみ DialogResult を設定できます。

ルートが違うんでしょうか?よくわかりません。
Window.cs
1451行目 SRID.DialogResultMustBeSetAfterShowDialogに対応しているように思えます。
何故そうなるかまでは探せる気がしません^^;

投稿2019/11/24 22:57

編集2023/07/16 02:31
TN8001

総合スコア9855

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

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

Zuishin

2019/11/24 23:11

> We don't support 以外に、whyも書いといてほしいですね。 同感です。 > 理由は想像ですけど「xaml上で値を設定されたくないから、わざとエラーになるようにしている」ってことじゃないでしょうか? xaml 上で値を設定できたらダイアログを閉じることができて便利なように思うんですが、そのあたりに何か罠があるのかもしれませんね。 それができて何が困るのか考えてみたいと思います。 ありがとうございました。
TN8001

2019/11/24 23:22

DialogResultが依存関係プロパティだったらいいのに、ってのはありますね。まあいまさらなわけですが。
dodox86

2019/11/25 14:55

私も実は本質問を注視していたのですが「何に使うものか」と言うより「使われないようにあらかじめ定義しているのではないか」との推測の意見に終始していたので、回答は控えていました。DialogResultConverterクラスのリファレンスを見ると、 https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.dialogresultconverter?view=netframework-4.8 .NET Frameworkの3.0から存在しているので、「最初から"使われないよう"に定義した」か、あるいは「その後使えるように発展するつもりだったが、ずっとそのままになってしまった」のどちらかかな、と考えていました。
dodox86

2019/11/25 15:14 編集

尚、その考えに至った根拠ですが、過去にMFCにおいて、あるウィンドウの派生クラスの仮想関数でオーバーライドされたものにvirtual void MemberFunc() { /* don't use */ ASSERT(FALSE); } とのようなものを見かけたような記憶があった為です。C++での話であり、それに今となっては本当にあったか記憶も不確かなのですが、「そのようなコードが会社の製品としてリリースされているのだから、今回もそのようなものなのではないか。」と思った訳です。薄弱な根拠ですみません。
Zuishin

2019/11/25 23:27

TN8001 さんのご意見は、「ShowDialog せず DialogResult を設定してはならないが、バインディングだとそれができてしまうので、してはならないことを示すためにわざと予約している」というもので、dodox86 さんのご意見は「予約している、もしくは未完成のまま確たる方向性が得られなかった」というものですね? どちらも説得力があるのですが、もう一つ決め手が欲しい気がします。もう少し保留させてください。ありがとうございます。
dodox86

2019/11/26 00:10

> ご意見は「予約している、もしくは未完成のまま確たる方向性が得られなかった」というもの はい、その通りです。コメントに既に書かせていただいたように「答え」ではなく「意見」ですので、決め手に欠けるのも自覚しています。このようなクラスが存在すること自体に興味がありますので、引き続き注視させていただきたいと思います。
TN8001

2019/11/26 01:56

そもそもDialogResultプロパティの存在理由が一番気になる。 WPFではShowDialog()がbool?を返すので別に必要ないのに。 で兄貴?のSilverlightを調べた。(Silverlight使ったことないんで、嘘書いてたら指摘お願いします) ChildWindowにDialogResultプロパティがあった。 さらに調べるとSilverlightではシステムの都合上?ShowDialog()で待てず、【しょうがなくClosedコールバックでDialogResultを確認する】ということになった。 WPFでは別にいらないけど、わざわざ消すほどでもなく残った。(Windowに付けたのを残ったというのは少々無理があるか?) が存在理由なのかなと思いました。 で、ChildWindow.DialogResultにDialogResultConverterが付いてるかどうかですが。。。わかりませんでした;; もし付いていれば「しょうがなく」の傍証になりませんかね?w つまり「こんなの(DialogResultConverter)ダサいってわかってるけど、やりようなかったんですぅ」って意味で。
Zuishin

2019/11/29 03:04

回答ありがとうございました。しめ縄とか封印の類と理解しておきます。
guest

0

日本語を知っていますか?

投稿2021/01/05 08:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zuishin

2021/01/05 08:02

どのあたりを見てそう思いましたか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問