在C#视图模型中访问XAML对象
我已经在我的视图xaml代码中设置了一个网格。它由一个由64个矩形和32个图像填充的网格组成。我有一个用于图像的模型类,我想将其中的一些属性绑定到XMAL opjects属性。ChessBoardViewModel.cs中的代码:在C#视图模型中访问XAML对象,c#,wpf,xaml,C#,Wpf,Xaml,我已经在我的视图xaml代码中设置了一个网格。它由一个由64个矩形和32个图像填充的网格组成。我有一个用于图像的模型类,我想将其中的一些属性绑定到XMAL opjects属性。ChessBoardViewModel.cs中的代码: foreach (ChessPiece Piece in ChessPieces) { Image Img = ChessBoard.FindName(Piece.Name) as Image; Binding RowBinding = new Bi
foreach (ChessPiece Piece in ChessPieces)
{
Image Img = ChessBoard.FindName(Piece.Name) as Image;
Binding RowBinding = new Binding("Row");
RowBinding.Source = Piece;
Img.SetBinding(Grid.RowProperty, RowBinding);
Binding ColumnBinding = new Binding("Column");
ColumnBinding.Source = Piece;
Img.SetBinding(Grid.ColumnProperty, ColumnBinding);
}
棋盘是包含所有图像的网格的名称
我的计划是,图像应该绑定到每个实例的行和列值,以确定它们在游戏中的位置
问题是,由于某种原因,我无法访问XAML对象,即使我包含了视图名称空间
编辑:
好的,这是我的代码,我现在打算怎么做:
<Grid x:Name="ChessBoard">
<Rectangle x:Name="A1" Fill="Black" Grid.Column="1" />
...
...
<Image x:Name="BlkRook1" Source="../Data/BlkRook.png" Grid.Row="{Binding ChessBoardViewModel.ChessPieces[0].Row}" Grid.Column="{Binding ChessPieces[0].Column}"/>
...
</Grid>
我想将XAML image Grid.Row和Grid.Column属性绑定到对象的正确实例。但似乎找不到实现它的方法。WPF是一种以数据为中心的语言,或者至少以这种方式使用时效果最好。我的意思是我们操作数据对象,而不是UI对象。因此,您不需要访问UI“board”控件,而是将集合绑定到该控件并操作集合中的项 作为一个简短的示例,您可以
将包含64个项的集合绑定到UniformGrid
,其中32个项的某些字段使其显示为“空”。例如,您可以为每个项目设置一个字符串
属性,该属性定义要显示的图像,并且空方块中可以有一个空的字符串
然后,您无需尝试将UI项从网格中的一个位置移动到另一个位置,只需将集合中的相关项移动到其新位置即可。。。例如,如果您想将一块板向上移动一个正方形,那么您应该将其向集合的开始移动8个项目,并将有8个位置的空块向末尾移动。在MVVM中,建议您使用数据绑定来设置和获取视图(xaml)和视图模型(例如ViewModel.cs类)之间的数据
下面是一个例子:
假设您希望将文本块添加到UI中,并在相应的视图模型类中访问其文本属性,或者从视图模型类在UI中设置文本属性。
因此,实现这一点的方法是将UI中的文本属性绑定到视图模型类中的对象。
以下是您的操作方法…
在您的xaml视图中:
在视图模型类中:
var textValue=采取措施设置text1的值
这里发生的是当视图模型中的textValue
值更改时,文本块的text属性也会更改其值,并且更改会反映在UI中。可以显示xaml吗?不能。就这么简单。使用适当的MVVM,并使用数据绑定将ViewModel的属性绑定到视图,其他一切都是徒劳无益的。数据绑定应该在您的视图的XAML中设置。我记得曾经发布过关于扫雷游戏的类似问题。您可能想查看它,了解您的模型/视图模型/视图在此类应用程序中的外观和交互方式。简短的回答是,拥有64个棋盘格对象的数组。让棋盘格
包含行索引
、列索引
、颜色
、和块
的属性,以识别其上的块。将该集合绑定到使用8x8网格的ItemsControl
,并在Piece
属性的XAML中使用DataTrigger
来确定要在屏幕上绘制的图像(默认值为no-Piece)。
ChessPieces.Add(new BlkRook() { Name = "BlkRook1", Row = 0, Column = 0 });