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