私はViewModelにXamarin.Forms.Colorオブジェクトの2次元配列を持っています。この配列を私のビュー内のBoxViewオブジェクトの束にバインドし、配列の内容に基づいて色を設定したいと思います。私はViewModel上でstring、int、boolのようなプロパティにバインドする方法を知っていますが、バインドしたい特定の値がColorのようなシステム提供のオブジェクトであれば分かりません。XamarinとMVVM - どのように私のViewModelの色の配列に私のビュー内のBoxviewをバインドできますか?
コードスニペット:
ViewModelには、私はにバインドしたい、このプロパティを持っています
public GameGrid<Color> Board;
ビューは、XAMLで宣言されたが、代わりにC#コードを経由していません。 _viewModel.Boardプロパティは、私はそれに結合しないか、2次元配列のセルであるかの色を入力することを考えると
boxView.BindingContext = _viewModel.Board[row, col];
boxView.SetBinding(BoxView.ColorProperty, ".", BindingMode.Default);
:私はバインドたいプロパティは、このように、BoxView内のColorPropertyです? "。"プレースホルダです - 私はそこに何を置くべきか分かりません。
GameGridクラスは2次元配列をラップします。これは、ゲームの移動をアニメーション化するために、後でこの配列の個々の要素の変更に反応できるように、INotifyPropertyChangedを実装する必要があるためです。完全を期すため、そのコードはここにある:
public class GameGrid<T> : INotifyPropertyChanged
{
private T[,] _array;
public GameGrid(int rows, int columns)
{
_array = new T[rows, columns];
}
public T this[int a, int b]
{
get
{
return _array[a, b];
}
set
{
_array[a, b] = value;
RaisePropertyChanged(nameof(GameGrid<T>));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(
this, new PropertyChangedEventArgs(propertyName));
}
}
私は、例えば単純なオブジェクトであることを私の二次元配列を変更した場合は、
boxView.SetBinding(BoxView.ColorProperty, "BindThis", BindingMode.Default);
が、それは不必要に複雑なようだ:
public class Wrapper
{
public Color BindThis { get; set; }
}
public GameGrid<Wrapper> Board;
このようなそのプロパティにバインドするために非常に簡単です。
これは非常に知っていると便利です - それはBindingContext自体にバインドする構文です!私はちょうどそれを試しました。私はBoxViewを灰色に初期化しています。これは、BoxViewをグレーとして表示するビューが開始されるため、うまくいきます。後で、クリックイベントに応答して、ViewModelの色を別の色に変更します。その更新は動作していないように見えます.BowViewはグレーのままです。だからそれはallllmosttt作品! – user2316154
プロパティ 'GameGrid 'が更新されましたが、その名前のプロパティは存在しないと言っているため、INPCが機能していません。もっと良い解決策は 'GameGrid 'にジェネリックイベントを持たせて、更新されたことを知らせることです。 VMはそのイベントに登録して、 'nameof(Board) 'でそれ自身の' PropertyChanged'を通知することができます。 –
それは理にかなっています。私はそれを試してみよう!それがうまくいくなら私は答えとしてこれをマークするために戻るでしょう。 – user2316154