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

时间:2017-07-16 22:52:23

标签: c# mvvm xamarin.forms

我的ViewModel中有一个Xamarin.Forms.Color对象的二维数组。我想将这个数组绑定到我的View中的一堆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属性是二维数组或Color类型的单元格,如何绑定它? “。”是一个占位符 - 我不知道我应该把它放在那里。

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);

但这似乎不必要地复杂化了。

1 个答案:

答案 0 :(得分:1)

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

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

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