我在我的View xaml代码中设置了一个Grid。它由一个填充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);
}
Chessboard是包含所有图像的Grid的名称。
我的计划是将图像绑定到每个实例行和列值,以确定它们在游戏中的位置。
问题是,即使我已经包含了Views命名空间,我也无法出于某种原因访问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>
和Viewmodel包含我的ChessPieces列表,如下所示
ChessPieces.Add(new BlkRook() { Name = "BlkRook1", Row = 0, Column = 0 });
我想将XAML图像Grid.Row和Grid.Column属性绑定到我的对象的正确实例。但似乎无法找到实现目标的方法。
答案 0 :(得分:6)
WPF是一种以数据为中心的语言,或者至少在以这种方式使用它时效果最好。我的意思是我们操纵数据对象,而不是 UI对象。所以你永远不需要访问你的UI'board'控件,而是Binding
该控件的集合和操作集合中的项。
作为一个简短示例,您可以Bind
将{64}项集合到UniformGrid
,其中32项具有一些使其显示为“空”的字段。例如,您可以为每个项目设置string
属性,以定义要显示的图像,空方块可以在那里显示空string
。
然后,您可以简单地将集合中的相关项目移动到新位置,而不是尝试将UI项目从Grid
中的一个位置移动到另一个位置...例如,如果您想移动在一块正方形的板上放一块,然后你将它移动到收集开始的8个项目,然后移动到那里有8个位置的空块。
答案 1 :(得分:0)
在MVVM中,建议您使用数据绑定在视图(xaml)和视图模型(例如ViewModel.cs类)之间设置和获取数据。
这是一个例子:
假设您要在用户界面中添加文本块并在相应的视图模型类中访问其text属性,或者在用户界面中从视图模型类中设置text属性。
因此,实现此目的的方法是将UI中的text属性绑定到视图模型类中的对象。
这是你的方法...
在您的xaml视图中:
<TextBlock text="{binding textValue}"/>
在您的视图模型类中:
var textValue = do something to set Value of text1
这里发生的是,当textValue
的值在视图模型中更改时,文本块的text属性也更改了它的值,并且更改反映在UI中。