在C#View Model中访问XAML对象

时间:2013-11-19 14:31:28

标签: c# wpf xaml

我在我的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属性绑定到我的对象的正确实例。但似乎无法找到实现目标的方法。

2 个答案:

答案 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中。