Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#视图模型中访问XAML对象_C#_Wpf_Xaml - Fatal编程技术网

在C#视图模型中访问XAML对象

在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

我已经在我的视图xaml代码中设置了一个网格。它由一个由64个矩形和32个图像填充的网格组成。我有一个用于图像的模型类,我想将其中的一些属性绑定到XMAL opjects属性。ChessBoardViewModel.cs中的代码:

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