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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

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

Q&A

解決済

2回答

1309閲覧

WPF,Point構造体のX成分,Y成分をTextBoxにバインディングしたい+バインディングの仕組みについて

ElecDove

総合スコア254

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

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

0グッド

0クリップ

投稿2017/07/12 10:39

いつもお世話になっております.


疑問I

WPFでPointをバインディングしたいのですが,
テキストボックスに中身を表示するだけでしたら①の方法も②の方法もどちらも思った通りの動作をします.

C#

1//hoge.pがPoint構造体の中身として,Xが5,Yが10とする 2//hogeはpをメンバにもつオブジェクト 3 4//① 「5」が表示 5<TextBox x:Name="Point_X" Text="{Binding hoge.p.X, Mode=TwoWay, UpdateSourceTrigger=Explicit}" /> 6 7//② 「5,10」と表示 8<TextBox x:Name="Point" Text="{Binding hoge.p, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/> 9

しかし,UI→Point構造体という向きになると,①のやり方では値が反映されません.
Pointがクラスではなく構造体だからなのかな?と思いましたが原因が思いつきません

原因と改善策を教えていただけると助かります.


疑問II

バインディングの時,型をあまり意識しないですが中では何が行われているのでしょうか
TextBoxやLabel相手だと,Text={Binding}とするとどうやらToString()が自動的に呼ばれているような感じですし...
(ToString()をオーバーライドして試してみました)

また,疑問IのPointの例ですとテキストボックスに「10,20」と入力するとX=10,Y=20が反映されます.

Point構造体にGetFromText()みたいなメソッドがあるわけではないので,BindingしたときにどうやってXにカンマより左の値を,Yにカンマより右の値を入れているのかがわかりません.
②のテキストボックスに「10」とだけ入力してもX=10となることはありませんでした.

かなり根本的なところですが,よろしくお願いいたします,

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

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

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

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

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

guest

回答2

0

編集対象のPointが沢山あるのなら、専用のUserControlを作ってはいかがでしょうか。

投稿2017/07/13 11:15

ebiryo

総合スコア797

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

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

ElecDove

2017/07/13 11:27

回答ありがとうございます いわれてみればその手がありますね! ただ,最近やっとWPF&XAMLに慣れてきたばかりでまだUserControlをカスタムするほどの技術はまだないので今回はごめんなさい...
ebiryo

2017/07/13 11:40

そうですか。それは残念です。 UserControlを使わないと同じような処理の繰り返しなってメンテナンス性が下がりますし、ラップクラスを作る手間と大して変わらないと思います。 UserControlを自由に作ってViewを構成できるようなると、WPFの理解も深まると思いますのでいつかチャレンジしてみてください。
guest

0

ベストアンサー

1は、適当にラップすればいい。構造体をnewするようにする。

public int X { get{ return p.X} set{ p = new Point(value,p.y); RaiseChangeXXX()} }

RaiseChangeXXXは、使っているライブラリに合わせて。(名前忘れただけ)
理由はこの辺を読むといいかな http://qiita.com/chocolamint/items/020143cf249505bf2ffc

2の答えは、 IValueConverter OR TypeConverter を使っているから。
https://tocsworld.wordpress.com/2014/04/20/wpf%E3%81%A7%E3%81%AEivalueconverter%E3%81%A8typeconverter/
http://blog.okazuki.jp/entry/2014/06/23/124835
この辺の記事

投稿2017/07/12 11:04

編集2017/07/12 11:13
kiichi54321

総合スコア1984

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

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

ElecDove

2017/07/12 12:48

回答ありがとうございます >適当にラップすればいい。 バインディングのためだけにプロパティをうまく作ってやらなきゃいけないのですね 苦労をいとうわけではないのですが,なんだか冗長だなぁというか, MVVMから外れてるとまでは思いませんが,そういうものなんですね... IIのIValueConverterやTypeConverterについてはこれから調べてみたいと思います ありがとうございました 
kiichi54321

2017/07/12 16:07

これに関しては構造体だからってことで、クラスの場合は大丈夫。ただまぁ、VMは、ViewとModelをつなぐものなので、冗長なのでは?と思うようなことは結構します。変更通知も仕込みますしね。
ElecDove

2017/07/13 09:51

構造体とクラスについて値型と参照型,あたりの基本的な概念は理解しているつもりです また,いつかの質問でも回答いただきましたが,16Byte未満は構造体でもよいとMSがガイドラインに出していますが,このような場合独自にPointをクラスで作り直したほうがいいとかあるのでしょうか 確かに変更通知もわざわざこんなことせずに認識する仕組みを用意してほしいものです・・・.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問