WPF: привязка коллекции к элементу управления - PullRequest
0 голосов
/ 16 февраля 2012

iv'e получил dll, состоящий из 3 классов, представляющих настольную игру:

   Board , Pipe , Checker 

доска - это набор труб, а трубы - это набор шашек

Движение противника будет состоять из удаления шашки из одной трубы и помещения его в другую.

моя доска представлена ​​сеткой с 23 элементами управления, мне нужно привязать каждый элемент управления к трубе, чтобы отображать движения в пользовательском интерфейсе

движение игрока будет выполняться путем перетаскивания между элементами управления предметами (еще не дошел до этой части)

Класс Шашки:

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

свойство IsMine необходимо использовать для определения цвета шашек.

Класс трубы: содержит ObservableCollection контролеров

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

что мне нужно сделать, это создать двухстороннюю привязку между каждым itemcontrol и соответствующим ему элементом Pipe для добавления и удаления элементов при изменении коллекции

мне также нужен специальный конвертер, который проверит свойство IsMine и установит объекты цвет соответственно (itemsControl DataItemTemplate состоит из эллипса, который будет представлять каждый контролер).

до сих пор iv'e просто заполняет коллекции и устанавливает их в качестве источника элементов для каждого элемента управления

например:

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

я столкнулся с двумя проблемами: (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));   

любые хорошие примеры двухстороннего связывания между collection и itemsControl были бы очень полезны.

Элемент управления:

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

шаблон данных:

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

1 Ответ

1 голос
/ 16 февраля 2012

Вместо прямой установки ItemsSource, вы должны создать привязку.

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