2010-08-09 85 views
0

我不太確定如何去解決我的問題。不尋找完整的代碼只是幫助我應該去哪個方向。因爲它的MVVM我不想要任何代碼隱藏......如果可能的話......wpf創建動態可點擊「網格」

從數據庫我得到我應該創建的「網格」的大小,例如2x3。 現在我想在這個網格中放置一個「物品」,它佔據一個或多個點。我現在試圖做一個包含網格的ItemsControl(我想要一個網格,因爲我想使用ShowGridLines =「True」) 但我該如何創建一個動態網格?想到使用uniformgrid,但那個沒有ShowGridLines ...

第二個問題(因爲我是mvvm noob)在網格中選擇一個點。你點擊的那個不會是一個問題。問題是如果你試圖放置的物品佔據兩個點。我怎麼知道哪個點是我點擊的那個點旁邊的那個點?

任何幫助表示讚賞

回答

2

既然你不能很容易地綁定一個電網的行/列的定義,我建議你建立一個簡單的自定義控制,直接從電網繼承。

這裏是我的方法有3個額外的依賴屬性:

  • INT MyColumnCount
  • INT MyRowCount
  • 的ObservableCollection MyChilds

的MyColumnCount/MyRowCount將被綁定到視圖模型屬性,當你從數據庫中得到新的值時,你更新它。此外,ViewModel將提供一個FrameworkElements的集合,它將成爲Grid中的項目並綁定到MyChilds。

您可以在ViewModel中創建新控件並使用網格的附加屬性來設置位置。例如:

TextBlock b = new TextBlock() { Text = "Hello World!" }; 
Grid.SetRow(b, <your position>); 
Grid.SetColumn(b, <your position>); 
Grid.SetColumnSpan(b, <your column span>); 
MyChilds.Add(b); 

PropertyChangedCallbacks新INT屬性,將修改行/列的定義,根據該新的值。 collection屬性的回調會在新的ObservableCollection上註冊一個集合已更改的事件,並在更改事件時將新項添加到Grid的子項。

這就是動態網格更改所需的全部內容。

回答第二個問題: 這很簡單。如果你發現你會得到網格中點擊項目的發件人。發件人大多是直接點擊的控件。您可以再次使用靜態網格功能,計算位置:

Grid.GetRow(item); 
Grid.GetColumn(item); 
Grid.GetColumnSpan(item); 

隨着網格的行/列的總數(我...算),就可以計算出鄰居位置。

Jan

+0

嗯聽起來很有趣我會試試你的方法。希望跳過創建一個自定義控件,但... – debe 2010-08-10 07:12:21

+0

@debe它的工作與否? – Omarj 2013-11-01 22:28:24