放浪軍師のXamarin.Formsアプリ開発局

Xamarin.Forms+Prism+ReactivePropertyで素人がAndroidやUWPのアプリを右往左往しながら開発している様を発信していきます。性質上間違いも多いのでご注意ください。

乱ちゃんProjectその6(己の恥を晒して助けを求める)

放浪軍師のXamarin.Formsによるアプリ開発
今回は乱ちゃんProjectその6になりますが、大いに苦しむ事になりました。
まず、初めて訪問された方は以下をお読みください。

www.gunshi.info

交神属性ランダムに取り掛かる

ボタンを押して1~3のいずれかを表示する進言ランダムに関しては完成したので、次の機能である交神属性ランダムにとりかかります。機能としては以下のような感じです。
f:id:roamschemer:20180202002338g:plain
ボタンを押すと4つの属性ラベルがランダムに光り、最終的にいずれかが光った状態で停止する。という機能を有しています。また、ラベルをクリックするとその属性はルーレットから除外されるようにもするつもりです。

さてここで賢明なプログラマであれば、『属性の数が増減した場合』を考慮して作成するハズです。俺もプログラマの端くれなのでそれを考慮して書きたかったのですが、ここで俺を大いに苦しめるコントロール配列という概念が俺の頭の中には登場してしまいます。

コントロール配列とはなんぞ?

もしかしたらVB6を扱ったことがない方にはわからないかもしれないので説明させていただきます。コントロール配列というのはVB6には存在した、同一名称のコントロールを複数並べて配列のように扱う事のできる機能の事を指します。Button1,Button2ではなく、Button[0],Button[1]のようになる感じですね。forなんかで回して使うのが一般的かと思います。

実はこの機能、VB6の後継であるVB.NETやその亜種であるC#においては削除されてしまいました。…何故消されてしまったのか?これが俺にはまだ理解が出来ていないのです。これに関しては色々なサイトでコントロール配列はもう必要ない過去の遺物だ!と書かれていてちゃんと説明もあるのですが…それが何故なのかがどうしても俺には理解ができません…。正直これは恥じるべき事だと認識はしています。でも仕方ないんだわ…わかんねぇんだもん…。

そんな俺がコードを書くとこんな感じになってしまう

先に言っておきますが酷いです。機能としては、各属性をクリックすると、その文字が白抜きに変化するという物になります。

[Viewの一部]

<Button Text = "火" 
        Command="{Binding KoushinCommand[0]}" 
        TextColor="{Binding KoushinTextColor[0].Value}"
        FontAttributes = "Bold" 
        Grid.Column="0" Grid.Row="0" />
<Button Text = "水" 
        Command="{Binding KoushinCommand[1]}" 
        TextColor="{Binding KoushinTextColor[1].Value}"
        FontAttributes = "Bold" 
        Grid.Column="1" Grid.Row="0" />
<Button Text = "風" 
        Command="{Binding KoushinCommand[2]}" 
        TextColor="{Binding KoushinTextColor[2].Value}"
        FontAttributes = "Bold" 
        Grid.Column="0" Grid.Row="1" />
<Button Text = "土" 
        Command="{Binding KoushinCommand[3]}" 
        TextColor="{Binding KoushinTextColor[3].Value}"
        FontAttributes = "Bold" 
        Grid.Column="1" Grid.Row="1" />

どうみてもコントロール配列です。本当にありがとうございました。

[ViewModelの一部]

public ReactiveCommand[] KoushinCommand { get; } = new ReactiveCommand[4];
public ReactiveProperty<string>[] KoushinTextColor { get; } = new ReactiveProperty<string>[4];

public RanShikaPageViewModel()
{
    for(int i = 0; i <= 3; i++)
    {
        KoushinCommand[i] = new ReactiveCommand();
        KoushinTextColor[i] = new ReactiveProperty<string>("Black");
        KoushinCommand[i].Subscribe(_ => KoushinTextColor[i].Value = "White");
    }
}

もうコードから死臭漂うレベルの酷さがうかがえるかと思います。しかもなんかボタンを押すとエラーになります。何故だかi=4が入った状態になるんですよね。更に言えばforeachも使えないし、どうやってもまともに解決が出来ませんでした。多分これはXamarinがどうのじゃなく、俺がC#をまだ正しく理解していないからだと考えられます。

とんでもなく恥ずかしい…が敢えて晒す。それがこのブログの存在意義だから。

繰り返しますが、このクソコードをここに記すのは本当に嫌で嫌で仕方ありません。コントロール配列は俺が心の底から嫌っているVB6の象徴みたいなもんだからです。でもここは初心者である俺が右往左往しながら開発している様を発信するブログなので、恥を忍んで記載しております。あともう一つ言い訳をするならば、どうあがいても解決できなかったから記載している面もあります。展示会の案件では、わからないから丸一日探しまくって…試行錯誤しまくって…それでもなんとか自力でBlueTooth通信やグラフのリアルタイム描画も実装できたというのに…こんなので音を上げざるを得ないVB6脳を持つ自分が悔しくて悔しくて仕方がありません。ちくしょう…。

お願いします…。助けてください。

本来ならしかるべき場所で質問として投稿するべきなのでしょうが、あえてここで助けを求めたいと思います。今後の為にも、この右往左往の顛末をこのブログに残したいのです。例えるならば三方ヶ原の戦いでうんこ漏らしながら逃亡した情けない自分の姿を、戒めの為に描かせた徳川家康みたいなもんです。
f:id:roamschemer:20180905010655j:plain:w150
実は後世の作り話らしいケド。

コメント、お待ちしております。