Xamarin.FormsのDataTemplateの内側から外側のBindingContextを参照した~い!
こんにちは。先日腕時計が壊れた、たねろうです。6月になりましたが、関東はまだ梅雨入りしないですね。普通に暑い晴れの日が多いです。周囲の人でエアコンをつけ始める人も多いですが、僕は寒がりなので例年梅雨明けまでつけないことが多いです。
さて、本題ですが、Xamarin.FormsでCollectionViewなどのDataTemplateの内側から外にあるBindingContextのViewModelを参照する方法がわかったのでメモしておこうと思います。
CollectionViewで表示するUIのひとつひとつに、削除ボタンを付けておく場合などにCommandを親のViewModelに持たせておいて共通化するということはよくあると思います。例を出すと、BindingContextにMainPageViewModelをもつMainPageの中に、ItemViewModelのリストをItemsSourceとするCollectionViewがあり、DataTemplateでその様式を指定しているとします。ここで、各DataTemplateの中に要素を削除するための削除ボタンをつけておく場合、各ItemViewModelにCommandを持たせるよりも、ItemViewModelのリストを持っているMainPageViewModelにCommandを持たせておいたほうが削除の処理が楽になりますし、ItemViewModelの数だけCommandを持たせる必要もなくなります。ここでは、MainPageViewModelがDeleteCommandを持っているとします。
今の状況をXamlで表すと以下のようになります。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="BlogTest"
x:Class="BlogTest.MainPage">
<ContentPage.Resources>
<DataTemplate x:Key="Item">
<Label Text="これはItemです"/>
<Button Text="削除"
Command=""/> //ここをどう指定するか
</DataTemplate>
</ContentPage.Resources>
<ContentPage.BindingContext>
<local:MainPageViewModel />
</ContentPage.BindingContext>
<StackLayout>
<Label Text="メインページです"/>
//ItemListはItemViewModelのリストです
<CollectionView ItemsSource="{Binding ItemList}"
ItemTemplate="Item"/>
</StackLayout>
</ContentPage>さて、ここでDataTemplateの内側からMainPageViewModelのDeleteCommandを参照するにはどうすればよいかというと、どうやらRelativeSourceを使うと上手くいくようです。
Command="{Binding Source={RelativeSource AncestorType={x:Type local:MainPageViewModel}},Path=DeleteCommand}"Commandをこう指定することによって、「MainPageViewModel型をBindingContextに持つ親を探し、あったらMainPageViewModelのDeleteCommandを代入する」という指定をすることができます。ここで、Xamarinのドキュメントによると、x:Typeの指定により、挙動が変わるようです。今回の場合のように、Viewから派生した型(Label, Entry, Editor, Buttonなど)ではない型を指定した場合、「その型をBindingContextにもつ要素を親から探す」挙動になりますが、Viewから派生した型を指定したときは、「その型の要素を親から探す」ことになります。
また、DataTemplateの内側から親を探す場合、DataTemplateがCollectionViewなど、Templateを適用する要素の子として配置された状態で親を探します。したがって、DataTemplateがどこに適用されているかで親の位置が変わったりするので注意が必要みたいです。
このあたりの挙動がよくわかってなかったので、分かってよかったです。
Xamarin.Formsで"specified cast is not valid"と出たが、凡ミスが原因だった
こんにちは。Xamarin勉強中のたねろうです。非常にどうでもいい凡ミスで苦しんだので、記事にしようかと思います。
現在試しに作っているアプリで、CollectionViewでDatatemplateにのっとってアイテムをずらっと表示させるということをやっていたのですが、ある時からアイテムを追加しようとすると"specified cast is not valid"というエラーが出るようになってしまいました。いろいろ情報を探してみても、ピンとくるものはなく。ううむ…と唸っていたところ、ふと気づきました。
ContentVIewとContentPageを間違えていました。本来なら
とするところで、ContentPageにしちゃっていました。凡ミス中の凡ミスでした。
Xamarin.Androidに「failed to open directory 指定されたファイルが見つかりません」と怒られた
結論:関係するフォルダの名前から日本語文字を取り除いてローマ字にしたら解決しました
Visual Studio 2019にて、Microsoftの公式ドキュメントを読みながら勉強していたときに、アプリを走らせようとしたところ「failed to open directory 指定されたファイルが見つかりません」というエラーが出てしまいました。resというディレクトリがないと主張しているのですが、(アプリ名).Android→obj→Debug→81→resに存在しています。これはどういうことか。
調べたところ、フォルダの階層が深すぎたりフォルダ名に日本語が混じったりしていると出ることがあるみたいです。そこで、とりあえず関係するフォルダの日本語を全部ローマ字にしてみました。すると出なくなりました。ファイルやフォルダを作るときに日本語を混ぜるのは良くないですね。英語力のなさからたびたびやってしまうのですが…
タイピング修行
タイピングが早くなりたい。最近よく考えることの一つです。軸足を現実世界よりもパソコンの中に置いて生きている僕にとって、キーボードとマウスは手足のようなものです。そして、マウスにはあまり上手い下手ありせんが、キーボードにはタイプの上手さというものがあります。
特にプログラミングを書くときなどは、キーボードをいかに早く操るかが生産性に大きく影響しています。最近は変数名の候補が予測変換されたりと便利になったものの、変換でなかなか出てこない関数名とかはズバっと入力したほうがいいわけです。
初めてパソコンを触って10年近く経ちますが、実はタイピングの指ポジションを意識したことはありませんでした。タイピングの関する努力はすることなく、自己流のタイピングを貫き通してここまできています。が、さすがに人差し指と中指のみにシフトを回しその他の指に仕事を振らないシステムも限界がきており、タイピング速度の上達はここ3年くらい止まっていました。-とか_とかはノールックで打てなかったし。
そこで2か月くらい前にホームポジションに矯正しました。人差し指と中指の伝統的スタイルではかったe-typingのスコアは200より少し高いくらいのA-かAだったのですが、慣れない指使いにした直後は140くらいまで下がりました。
で、今。青空文庫でちまちまと名著をタイピングして練習した結果、

327でThunderまできました。すげえよホームポジション。なんとなく面倒くさくて敬遠してたのを後悔してます。情報の時間とかに
「あ~、これね(笑)。こんなの、真面目ちゃんしかやってないから。俺みたいなのは"コレ"だから。やっぱさ、文科省のいうこと鵜呑みにしちゃ、「格」が低いよね~(笑)」
とか言っていたのは何だったのでしょうか。ホームポジションも万能ではないみたいですが、そこそこには役に立つものですね。
で、今後も修行やっていきます。現状の課題としては、ホームポジションでやりづらい場合を自己流にアレンジする「最適化」をまだやっていないことです。といっても現状の僕の速さだと最適化とかはまだ早いとかあるんですかね?その辺全然わからないので。
最終的に、500超えるくらいになったらいいなあ。そしたらズコズコと打てますよね、多分。
末端の魔力
盲腸線ってありますね。鉄道路線で主要な路線からピロっと短く分岐してる路線のことです。
なんか最近盲腸線っていいなって思うんです。大体空いてるんです。人でギッシリになってる支線って僕的にはあんまイメージ浮かばないです。分岐する駅で乗り換えてガラガラの車内。これだけでなんかエモいじゃないっすか。それに分岐先って幹線沿いの地域よりだいたい寂れてたりちょっと田舎っぽかったりするんですけど、その緩い雰囲気も大好きなんですよね。
なんか異世界に分岐したみたいな雰囲気というか、
「あ、"迷い込んじまった"か…」って感じが好みなんです。
そんで終点の駅は大体いい感じに栄えてないのがいいです。さて、来たはいいものの…ってなるあのセンチメンタルな感じがすげぇ好きです。なんかそのまま失踪してしまいたくなるような、このままこの町に吸い込まれたらどうなるんだろうとか考えたりしてしまいます。
特に好きなのは西武の「西武園」駅ですね。マジで周りが山なんですよね。おいおい、東京にこんなゴリゴリの森あんのかって思います。そんでホームも寂しい感じで非常にいい。エモい気分になりたいときはぜひ。
ただ近くに「西武遊園地」駅があったので超紛らわしかったです。だけど2021年3月ダイヤ改正で「多摩湖」駅に改称されたから安心! …と思いきや旧「遊園地西」駅が「西武園ゆうえんち」になったので結局危険なのは変わらず。というか西武園ゆうえんち駅のほうが西武園駅よりも遠いので間違えたときのダメージがむしろデカくなっている。しかもあの辺は路線網が迷路のように入り組んでいるので迷わないように行くときはご注意を。まあその辺の駅はどこで降りても似たような景色なので盲腸線の終着にこだわらなければ適当に乗って大丈夫です。
Corona sdk始めてみました
こんにちは。最近めっきり春めいた気候になってきましたね。桜も地方によっては咲き出してるみたいですし、僕の花粉センサーも日々絶好調です。アレグラでしのいでいるのですが、アレグラを貫通する日もあります。特に今年は新型コロナがいるということもあり人前で鼻水をすするのも気がひけますからね。花粉症にはつらい季節ですよ本当に。
さて、最近ではコロナというとすっかりウイルスのほうを指しますが、今日は別のコロナの話を。
corona sdkというものがあります。僕も正確にはわかってないんですが、簡単に言うとLuaを使ってゲームを作れるやつみたいです。ただ、どうも日本でやってる人が少ないみたいです。検索してもほぼ英語のサイトしか引っ掛かりません。
このcorona、言語はluaです。他の言語をさしおいてluaです。面白いですね。実は僕がcoronaをやってみたのはluaだったからという点が大きいです。僕は昔aviutlというソフトを使っていたのですが、そのソフトでスクリプトを書くときの言語がluaでした。その縁でなんとなくluaには親しみがあったんですね。luaは書くのが簡単なんでそれ以来気に入ってます。
ゲーム作りはDSiのプチコン(basic的な言語でプログラミングができるソフト)以来だったのですが、割りとシンプルでわかりやすいです。多分詳しい人からしたらいろいろ準備されすぎてて気持ち悪いかもしれませんが、僕にはちょうどいいです。適当にオブジェクト作って動かすだけでも面白いです。画面のタップの時の制御とかも簡単に関数でできるようになってるので、簡単な2Dのスマホゲーならすぐ作れそう。
ただ今現在、作りたいものがないのでストップしています。その点野田クリスタルってすげぇなって思ってます。あんなにたくさん奇ゲーのアイデアが思い浮かんだら楽しいだろうなぁ。
作りたいものができたらまた触ってみようかと思います。
766円
最近、いろいろあって臨時収入として766円を手に入れたのですが、使い道に困っています。この金額、僕にとっては自由に使うには小さく、選択肢を確定するのには大きすぎる金額なんですよね。766円きっかり、できるだけ楽しく使う方法。最近、春休みで暇なこともありこの案件が常に頭を支配しています。(別に766円にプラス何円かしてもいいですけど、なんとなく単体で使いたいのです)
最初に思い浮かぶ766円かかるものといえばラーメンですかね。平均的な店のラーメン並盛り、安い店になると味玉とご飯がつけられるくらいのラインでしょう。これはいいアイデアですね。問題は僕の家の周りにいいラーメン屋がなく、交通費が余分にかかることが確定していることです。チャリで行けば無料で行けるんですけどね。ちょっと遠いんです。
シンプルに電車代往復を考えると片道約380円です。使えるの交通費なので無料で楽しむ必要があります。行った先で一円も使えないわけですからよっぽどポテンシャルの高い場所じゃないときつい。桜の名所とかならいけるかもしれません。
GEOのオンラインストアで中古ゲーを探すと766円で買えるものが結構あります。Wiiのトワプリとかいけます。ポケモンのムーンとかもいけるっぽいです。ただ、ドラクエとかは値崩れしてません。悩みどころです。
この議論、結局答えは出るんでしょうか。766円の使い道にはあまり脳のリソースを割いていられないので、1週間たっても結論が出なかったら無難にうまい棒76本でいこうかと思います。