はかせのラボ

私の頭の中を書いていく雑記ブログです

xaml is 何

お久しぶりです。hakaseです。
今回はゲームプログラマーの就活について的なことを
書こうかなぁと思ったのですが特に思いつきませんでした。
ということでいつも通り覚書をつらつら書いていきたいと思います。

今回はxaml is 何です。

xaml is 何

xamlっていうのは名前から察せそうな気がしますが、
xmlライクなタグ使って構造を作っていくマークアップ言語になります。
基本WPFのUI部分(View部分)を定義するのに使うらしいです。
他で使われているって話はあんまり聞かないです。

全然ぱっと見違うものなんで想像できないかもですが、
最終的にxamlc#コードに変換されます。

動作とか汎用的なことはc#で、
見た目の定義はxamlでっていうのが
WPF界隈での基本認識らしいです。

詳しくはmicrosoftのページで見てください。
docs.microsoft.com

コードビハインド

xamlはUI定義を行うものという話をしましたが、
動きを作ることもできます。

色々な方法で付けられるのですが
その中でも一番簡単な方法です。

VisualStudioでxamlファイルを作ると勝手にxaml.csというファイルも
一緒に生成されます。

ここにコードを書くとxamlで宣言した
オブジェクトにアクセスしたりコールバックを使ったりできるようになります。

コードビハインドの使用はおすすめしない

これはあくまで自分の経験や教えてもらったことベースの話なので
常に適用されるお話ではないということを予め断っておきます。

ネット上にも転がっている話なので見たことがあるかもですが、
コードビハインドにロジックを書くとView層に見た目に関すること以外も
含まれることになり保守管理のコストが増えます。

わざわざWPFで作ってるのにも関わらず
保守管理のコストがWinFormsと大差なかったら
ただただめんどくさいだけでメリットがありません。

コードビハインドを使わなければ実現できない
もしくは
コードビハインド使わないと大量のファイルやコードが必要になる
等の理由がない限り使わない方がベターでしょう。
デカくなった時の保守管理が楽になるので。

あとがき

今回はxaml is 何について書いてみて
明らかに短かったのでコードビハインドについてもちょろっと書いてみました。

ぶっちゃけネットで聞きかじったことの再編集程度なので
誰かの参考になるとかはないと思ってないですが、
書いておかないと私が覚えていられないので許してください。

そしてコードビハインドの使用有無は個人の主観やプロジェクトの規約とかで
コロコロ変わると思うので柔軟に考えていくことが大事だと思います。

それでは今回はこの辺でノシ

WPF データバインディング is 何?

どうも、先日ダイパリメイクが発表されテンションが高いhakaseです。

さて前回WPFの初歩を刻んだところで、
今回はWPFの基本であり全てとも言って過言ではない、
「データバインディングについて書いていきます。

データバインディング is 何

よくMVVMとかMVCの設計パターンを勉強していると、
「ViewとModelは分離しろ」
疎結合になるようにしろ」

的な文言を見ると思います。

それを実現するためにWPFに用意されている機能です。(ざっくり)

WPFは基本的にViewはxamlで、ModelやViewModelはC#で作ります。
つまりC#xamlのつながりをかな~りゆるくするために使います。

イメージこんなの。
f:id:hakase0274:20210228164202p:plain

DataContextっていうのはxamlに設定できるC#インスタンスのことです。
TextBlockのTextプロパティにDataContextの中にあるTextプロパティの値がはめられます。

あとはそれぞれのTextプロパティが変わったとき、
それを通知してそれぞれの値を更新するという流れです。

具体例を交えて

実際に具体例を交えてやっていきます。
前回の記事で出した例を流用して話をします。

まずはxamlC#インスタンスを繋げます。
とりあえずDataContextにC#インスタンスを突っ込みます。

xmlns:vm="clr-namespace:LivetApp1.ViewModels"

<Window.DataContext>
    <vm:MainWindowViewModel />
</Window.DataContext>

xmlns~はC#でいうusingみたいなもんです。
DataContextの中に突っ込みたいC#クラス名を入れます。
(そしたら勝手にインスタンス化してくれます)
ちなみにDataContextには一つのインスタンスしか入れれません。

そしてDataContext内のプロパティをxamlのプロパティにあてはめます。

<Grid>
    <TextBlock Text="{Binding BindText,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

あてはめたクラスとプロパティはこんな感じ。

private string mBindText = "Hello World";
public string BindText
{
    get => mBindText;
    set => RaisePropertyChangedIfSet(ref mBindText,value);
}

C#->xamlはRaisePropertyChangedで通知を行います。
これはLivetの機能なので詳細割愛です。

xaml->C#はModeをTwoWayとかにしておけば勝手に通知されます。

例ではフルで書いてますが、
ModeとUpdateSourceTriggerはDefaultで設定されているので、
基本なんも書かなくても通知はいきます。

つまりやることとしては
・DateContextにインスタンスをはめる
xaml側プロパティにBindingを書く
C#でプロパティを定義し変更時に通知する
ぐらいです。簡単ですね。

あとがき

今回はデータバインディングとはなんぞや?ってのを書いてみました。

ぶっちゃけ自分はここに書いてあることぐらいしかわかっていません。
RaisePropertyChangedがどういう方法でxamlに通知してるのかとか、
よくわかっていません。(コード読めって話ですが)

今後もまったり作ったりしながら勉強していきまーす・・

それでは今回はこの辺でノシ