Xamarin 和 MVVM - 如何将视图中的 Boxview 绑定到 ViewModel 中的 Color 数组?



我的ViewModel中有一个Xamarin.Forms.Color对象的二维数组。我想将此数组绑定到我的视图中的一堆 BoxView 对象,并根据数组的内容设置它们的颜色。我知道如何在 ViewModel 上绑定到字符串、int 或 bool 等属性,但如果我要绑定到的特定值是系统提供的对象(如 Color(,我不知道。

代码片段:

ViewModel 具有我想绑定到的此属性:

public GameGrid<Color> Board;

视图不是在 XAML 中声明的,而是通过 C# 代码声明的。我想绑定的属性是 BoxView 的 ColorProperty,如下所示:

boxView.BindingContext = _viewModel.Board[row, col];
boxView.SetBinding(BoxView.ColorProperty, ".", BindingMode.Default);

假设 _viewModel.Board 属性是二维数组或颜色类型中的单元格,如何绑定到它?"." 是一个占位符 - 我不知道我应该在那里放置什么。

GameGrid 类包装了一个二维数组,因为我认为我需要实现 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));
}
}

如果我将二维数组更改为简单对象,例如;

public class Wrapper
{
public Color BindThis { get; set; }
}
public GameGrid<Wrapper> Board;

像这样绑定到该属性是非常微不足道的:

boxView.SetBinding(BoxView.ColorProperty, "BindThis", BindingMode.Default);

但这似乎不必要地复杂。

看起来你走在正确的轨道上。单个点(.(是绑定到BindingContext本身的语法;不是BindingContext上的属性,而是当前BindingContext的对象。

您是否尝试过仅使用.作为Binding表达式运行代码?

BoxView.Color属于Xamarin.Forms.Color类型,因此您应该能够直接绑定到该类型。

最新更新