2012-02-16 4 views
0

Iv'e получила библиотеку DLL, состоящую из 3-х классов, которые представляют собой настольную игру:WPF: Привязка коллекции к ItemsControl

Board , Pipe , Checker 

доска представляет собой набор труб и труб представляют собой набор шашек

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

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

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

средство проверки Класс:

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

свойство IsMine должно быть использовано для определения шашки Col или .

Труба Класс: держит 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;    
} 

то, что мне нужно сделать, это создать 2-полосные связывания между каждым ItemsControl и это соответствующий пунктом Pipe добавлением и удалением элементов, когда коллекция изменяется

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

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

, например:

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

я столкнулся с 2 проблемами: (1) эфир создают двустороннюю привязку с преобразователем 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 и коллекциями я попытался добавить эллипс к элементу управления элементом, который выбросил исключение о том, что без каких-либо предметов может быть добавлено, пока элемент управления используется. –

ответ

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

спасибо, что это работает от источника к управлению, как бы вы протестировали его от источника к источнику. Посмотрите на datatemplate в моем вопросе выше. , если я должен добавить эллипс, если он обновит исходную коллекцию или есть еще один последовательный способ добавления объекта желаемого шаблона? –

+0

Я не вижу, как это отличается от Pipe23.ItemsSource = board.Pipe [23] он также обновляет их. Единственная причина, по которой я хотел указать привязку, как вы описали, это сделать ее буксируемой, поэтому при добавлении нового эллипса в Pipe23 (ItemsControl) объект Checker будет добавлен в Pipe (Checker Collection). , но как бы он знал, чтобы добраться до Checker у источника? это можно сделать? –

+0

Вы должны изменить свою модель, и пользовательский интерфейс будет автоматически обновляться. Таким образом, вы будете обрабатывать событие, когда пользователь перетаскивает маркер из pipeA в pipeB. В этом случае вы удалите контрольную панель с досок. Пипсы [A] и добавьте ее на доски. Пики [B]. Поскольку вы связали коллекции, вам не нужно вручную обновлять пользовательский интерфейс. – SynXsiS

Смежные вопросы