C# Xamarin和MVVM-如何将视图中的Boxview绑定到ViewModel中的颜色数组?

C# Xamarin和MVVM-如何将视图中的Boxview绑定到ViewModel中的颜色数组?,c#,mvvm,xamarin.forms,C#,Mvvm,Xamarin.forms,我的ViewModel中有一个Xamarin.Forms.Color对象的二维数组。我想将此数组绑定到视图中的一组BoxView对象,并根据数组的内容设置它们的颜色。我知道如何绑定到ViewModel上的字符串、int或bool等属性,但如果我要绑定到的特定值是系统提供的对象(如颜色),我不知道 代码片段: ViewModel具有我要绑定到的以下属性: public GameGrid<Color> Board; 假设_viewModel.Board属性是二维数组或类型颜色中的单元格

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

代码片段:

ViewModel具有我要绑定到的以下属性:

public GameGrid<Color> Board;
假设_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));
    }
}

但这似乎不必要的复杂。

看起来你走对了方向。单点(
)是绑定到
BindingContext
本身的语法;不是
BindingContext
上的属性,而是作为当前
BindingContext
的对象

您是否尝试过将
作为
绑定表达式运行代码


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

了解这一点非常有用-这就是绑定到BindingContext本身的语法!我刚试过。我将BoxView初始化为灰色,这非常有效,因为视图开始将BoxView显示为灰色。稍后,为了响应一个单击事件,我将ViewModel中的颜色更改为不同的颜色-更新似乎不起作用-BoxView保持灰色。所以这一切都很有效!您的INPC不工作,因为您说属性
GameGrid
已更新,但没有该名称的属性。更好的解决方案是在
GameGrid
上设置一个通用事件,在更新后发出信号。然后,虚拟机可以订阅该事件,并使用有意义的
nameof(Board)
在其自身上发出
PropertyChanged
信号。我要试试看!如果这样的话,我会回来把这个标记为答案。
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);