2012-02-16 123 views
0

iv'e得到由3類,其表示棋盤遊戲的DLL:WPF:綁定集合到一個ItemsControl

Board , Pipe , Checker 

板是管道和管道的集合是跳棋

的集合

對手的動作將包括從一個管道中取出一個檢查器並將其放置在另一個管道中。

我的板是由網格面板23項的控件來表示, 我需要每個項目控制綁定到一個管,以便顯示在UI上

玩家移動將由來完成運動所述itemcontrols 之間下降拖動(還沒有得到解決,以該部分還)

的檢查類別:

public Checker 
    { 
     public bool IsMine{get; set;} 
    } 

的IsMine屬性需要被用來確定跳棋山口要麼 。

的管道類:持有跳棋

public class Pipe : INotifyPropertyChanged 
    { 
    public Pipe() 
    { 
     checkers = new ObservableCollection<Checker>(); 
    } 

    private ObservableCollection<Checker> checkers {get;set;} 
    public ObservableCollection<Checker> Checkers 
    { 
     get { return checkers; } 
     set 
     {        
      checkers = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Checkers")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged;    
} 

它與我需要做的就是創建一個2路的每個ItemsControl中之間的結合有什麼和管道項目的添加和刪除項目時,集合更改

的一個ObservableCollection

我還需要一個自定義轉換器,它將檢查IsMine屬性並相應地設置對象 顏色(itemsControl DataItemTemplate由一個橢圓組成,其中 代表每個檢查器)。

至今iv'e只是填充集合,並將它們設置爲源項爲每個項控制

例如:

Pipe23.ItemsSource = board.Pipes[23].Checkers; 

我面對2周的挑戰: (1) ether創建一個與OwnerToColor轉換器的雙向綁定,其代碼位於 之後,我找不到這樣做的例子。

(2)創建此標記中結合,但隨後我怎麼能初始化在適當的管道

例如啓動項目 :

pipe23 starts with 2 checkers 

board.Pipes[23].Checkers.Add(new Checker(true)); 
board.Pipes[23].Checkers.Add(new Checker(true)); 

收集之間的2路綁定任何很好的例子和itemsControl將不勝感激。

ItemsControl的:

<ItemsControl Grid.Row="0" Grid.Column="0" Name="Pipe23" ItemTemplate="{StaticResource PipeDataItem}"/> 

中的DataTemplate:

 <DataTemplate x:Key="PipeDataItem" > 
      <Ellipse Width="45" Height="45" Fill="{Binding IsMine,Converter={StaticResource MyOwnerToColorConverter}}"></Ellipse> 
    </DataTemplate> 
+0

我開始覺得也許這是不可能使ItemsControl的和收集 我嘗試添加一個橢圓形的項目控制,這引發了異常,說明之間的牽引方式綁定 沒有項目可以在itemscontrol正在使用時添加。 – 2012-02-16 04:08:50

回答

1

而是直接設置的ItemsSource的,你應該建立一個具有約束力。

Binding b = new Binding(); 
b.Source = board.Pipes[23]; 
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
b.Path = new PropertyPath("Checkers"); 
Pipe23.SetBinding(ListBox.ItemsSourceProperty, b); 
+0

感謝這似乎從源到控制, 你將如何測試它從控制源。 在上面的問題中查看數據模板。 如果我在哪裏添加一個橢圓應升級的源集合 或有添加所需的模板的對象的一些更一致的方式? – 2012-02-16 04:17:51

+0

我不明白這是怎麼從 Pipe23.ItemsSource = board.Pipe [23] 它更新它們也不同。 我想指定綁定像你描述的唯一理由是讓它拖的方式,增加了新的橢圓上Pipe23(ItemsControl的)一個檢查 對象將被添加到管道(檢查集合),所以當。 但是它如何知道將它交給源中的Checker? 可以這樣做嗎? – 2012-02-16 04:37:17

+0

你應該修改你的模型,UI將自動更新。因此,當用戶將一個標記從pipeA拖到pipeB時,您將處理該事件。在這裏你可以從棋盤上移除棋子。管[A]並將它添加到板上。管[B]。既然你已經綁定了集合,你將不需要手動更新UI。 – SynXsiS 2012-02-16 05:07:46