簡體   English   中英

在 C# 視圖模型中訪問 XAML 對象

[英]Accessing XAML objects in C# View Model

我在我的 View xaml 代碼中設置了一個網格。 它由一個填充了 64 個矩形和 32 個圖像的網格組成。 我有一個用於圖像的模型類,我想將一些屬性綁定到 XMAL-objects 屬性。 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 是包含所有圖像的網格的名稱。

我的計划是將圖像綁定到每個實例的 Row 和 Column 值,以確定它們在游戲中的位置。

問題是由於某種原因我無法訪問 XAML 對象,即使我已經包含了 Views 命名空間。

編輯:

好的,這是我的代碼以及我現在計划如何執行此操作:

<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>

和包含我的 ChessPieces 列表的 Viewmodel 像這樣

ChessPieces.Add(new BlkRook() { Name = "BlkRook1", Row = 0, Column = 0 });

我想將 XAML 圖像 Grid.Row 和 Grid.Column 屬性綁定到我的對象的正確實例。 但似乎無法找到實現它的方法。

WPF 是一種以數據為中心的語言,或者至少在以這種方式使用時效果最好。 我的意思是我們操作數據對象,而不是UI 對象 因此,您永遠不需要訪問您的 UI“板”控件,而是將集合Binding到該控件並操作集合中的項目

作為一個簡短的示例,您可以將 64 個項目的集合BindUniformGrid ,其中 32 個項目具有一些使它們顯示為“空”的字段。 例如,您可以為每個項目設置一個string屬性,用於定義要顯示的圖像,而空方塊在那里可以有一個空string

然后,與其嘗試將 UI 項目從Grid一個位置移動到另一個位置,您只需將集合中的相關項目移動到其新位置……例如,如果您想將一塊棋盤向上移動一格,然后您將它移向集合的開頭 8 個項目,並將那里的空白部分移向結尾的 8 個位置。

在 MVVM 中,建議您使用數據綁定來設置和獲取視圖 (xaml) 和視圖模型(例如 ViewModel.cs 類)之間的數據。

下面是一個例子:
假設您想向 UI 添加一個文本塊並在相應的視圖模型類中訪問它的文本屬性,或者從視圖模型類中設置 UI 中的文本屬性。 所以實現這一點的方法是將 UI 中的 text 屬性綁定到 view-model 類中的一個對象。
這是你如何做到的...
在您的 xaml 視圖中:
<TextBlock text="{binding textValue}"/>

在您的視圖模型類中:
var textValue = do something to set Value of text1

這里發生的情況是,當視圖模型中textValue的值發生變化時,文本塊的 text 屬性也會更改它的值,並且該更改會反映在 UI 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM