閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

剣の国の魔法戦士チルノ【ソード・ワールドRPG完全版】

剣の国の魔法戦士チルノ by さっちゃん - ニコニコ動画

久々にTRPGのリプレイ動画を見ているけど、面白い。

地味ぃに進む旧ソードワールド by さっちゃん - ニコニコ動画

同作者さんの別卓で、こちらは完結済み。Part76もある。永遠にみられるぞ! と思ったけどもう全部見てしまった。こちらは若干、潔癖な人には合わないネタがあるかもしれないけど、テンポ良く見やすい動画でした。チルノの方は教育目的というていでやっているので比較的健全で、チルノの成長を見守るおっさんの気持ちにもなれるのが良い。

WPFでデザイン時にのみDataContextを指定する

デザイン サーフェイス上のサンプル データとプロトタイプを作るためのサンプル データ - UWP app developer | Microsoft Docs

に全部書いてある。

特にUserControlなど作っているときに、ViewModelは外から設定されるのでDataContextは設定したくない、けどないとインテリセンスなど効かなくて不便、という場合。

<UserControl.DataContext>
  <local:ViewModel/>
</UserControl.DataContext>

などと書くとUserControl生成時にViewModelもインスタンス化されてしまい、親コントロールからDataContextを設定されるようなケースだと無駄なインスタンスができてしまう。

<UserControl
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  mc:Ignorable="d"
  ...
  d:DataContext="{d:DesignInstance local:MainViewModel}">

そういった場合は上記のようにd:DataContext属性を使う。mc:Ignorable属性に指定されているプリフィクスは無視されるのでインスタンスは重複しない。ただこれだとプレビュー時にもインスタンス化されず、値が見えないので少し不便。デザイナから見る時だけインスタンス化したい場合はIsDesignTimeCreatable属性をTrueにする。

<UserControl
  ..
  d:DataContext="{d:DesignInstance local:MainViewModel, IsDesignTimeCreatable=True}">

…ということが、公式ドキュメントも一番上に載せたページくらいしか見当たらず。Blend SDKにリファレンスって無いのでしょうか……。

MenuItemのソースをもうちょっと読んでみる

結局、

<MenuItem Header="{Binding Value}" HeaderStringFormat="{}{0}円"/>

<MenuItem Header="{Binding Value, StringFormat={}{0}円}" HeaderStringFormat="{}{0}円">
    <MenuItem.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ., StringFormat={Binding HeaderStringFormat}}" />
        </DataTemplate>
    </MenuItem.ItemTemplate>
</MenuItem>

と自動で展開されて、

<MenuItem>
    <MenuItem.Header>
        <TextBlock Text="{Binding Value, StringFormat={}{0}円}"/>
    </MenuItem.Header>
</MenuItem>

と等可になる、ということですかね。ソースだけで動きを追うのたいへんだなぁ…。

MenuItem.Headerに対してStringFormatが効かない

<MenuItem Header="{Binding Value, StringFormat={}{0}円}"/>

みたいに書いてもStringFormatの部分が無視されてしまう。ググって見ると WPF binding with StringFormat doesn't work on ToolTips - Stack Overflow がヒットして、もしやと見てみたらMenuItemにもHeaderStringFormatプロパティがあってこちらを使うと良いらしい(検索する前にドキュメントを見ろという話)。

<MenuItem Header="{Binding Value}" HeaderStringFormat="{}{0}円"/>

MenuItem(実際はHeaderedItemsControl).Headerはobject型なので、Binding.StringFormatは機能しないんですね。TextBlock.Textなどはstring型なので動作するみたい。…ってこと自体すでにドキュメントに書かれているし。

Gets or sets a string that specifies how to format the binding if it displays the bound value as a string.

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.data.bindingbase.stringformat?view=netframework-4.7.2

内部的にはItemsControlがHeaderとHeaderStringFormatをDisplayMemberTemplateSelectorに渡してこれがTextBlockを子に入れ込んでいる感じなんですかね。

WPFのソース

Announcing Open Source of WPF, Windows Forms, and WinUI at Microsoft Connect(); 2018 - Windows Developer Blog

おっ、WPFのソースGitHubに上がったのか、どれどれ……って見たいのはPresentationFrameworkなのに、思ってたのと違う~。

と思ったけどPresentationFrameworkなんかは元々Reference Sourceで公開されているものに含まれていますね(Source\wpf\src\Framework\ あたり)。とっくの昔にDL済みでもあった。

Adaptive Code

Adaptive Code ~ C#実践開発手法 第2版 (マイクロソフト関連書)

Adaptive Code ~ C#実践開発手法 第2版 (マイクロソフト関連書)

とりあえず、さらっと流し読み。Adaptive Code = 適応力のあるコード、みたいなものらしいけど、1部はまるまるアジャイルについて解説されていて開発プロセス全体の解説書みたいになっている。2部からC#を題材にしてプログラミング回りの話になり、デザインパターン/TDD/SOLID原則/Code Contract/Inversion of Control/Dependency Injection あたりに触れられている。

「一貫性を優先する」というところで「フィールド変数にthisを使うかアンスコを使うかみたいなことでけんかをするのは時間の無駄だからやめとけ」と言っていたのはよかった。この辺プロジェクト変わる度にコーディングスタイル変わるような環境だと、統一さえさてればなんでもいいやってなりますよね。

「newがある」をコードスメルとするのは原理主義的なような、でも基準としてはわかりやすいか。DIはあまりやらないからなぁ。

Stairwayパターンは知らなかった。こういうアセンブリの依存関係に対するパターンみたいなのもあると助かるんだけどな、と思うこの頃なので、この辺もっと勉強しないとな。

カバー範囲が広くてこれ一冊で色々済ませられる教科書として良さそう。

Win32APIのウィンドウメッセージ一覧

意外とまとまってるページって少ないのかな。MS Docもマウスイベントだけ、みたいなまとまり方で、それはそれで便利なんだけどとりあえず全部出してよっていう時に物足りない。

PINVOKE.NETのConstant.WMのページが良さげ? C#で使いたい時にもすぐコピペできるし。

winuser.h見ればいいじゃんという話ではあるんだけど、定数と構造体の型定義だけで1.5万行はカロリー高すぎますね。