2014-11-10 1 views
1

, поэтому я занимаюсь шахматной игрой, чтобы узнать C# и WPF.C# WPF Chess binding и ObservableCollection, как изменить?

Были ли у вас много ошибок и до сих пор придумали какой-то код, теперь моя проблема в том, что когда я создаю шахматные фигуры на своей доске, я не знаю, как их модифицировать внутри коллекции observbleCollection, например, удаляя одну часть. С помощью этого кода я могу добавить части к доске.

Но как я могу изменить его после того, как я его создал?

this.ChessBoardd.ItemsSource = new ObservableCollection<ChessPiece> 
{ 
    new ChessPiece{Type_ = Piece.Pawn, Player_ = PiecePlayer.Black, Posx_ = 30, Posy_ = 50}, 
    new ChessPiece{Type_ = Piece.Pawn, Player_ = PiecePlayer.Black, Posx_ = 30, Posy_ = 50} 
}; 

В этом же файле у меня есть следующий код:

public class ChessPiece : INotifyPropertyChanging 
{ 
    private int posx_; 
    private int posy_;  

    public int Posx_ 
    { 
     get { return this.posx_; } 
     set { this.posx_ = value; OnPropertyChanged("Posx_"); }    
    } 

    public int Posy_ 
    { 
     get { return this.posy_; } 
     set { this.posy_ = value; OnPropertyChanged("Posy_"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Вот с моей идеей было то, что я мог бы некоторые, как изменить ObservableCollection массив, например (это не работает, так как я не знаю, как это сделать), а затем щ обновит платы automatlicy, поскольку я имею infotifyproperychangin и связывание в файле XAML,

this.ChessBoardd.IteamsSource[0].Posx_ = 50; 

Любые идеи по этому поводу? Должен ли я соглашаться с другим способом?

+2

Внесите 'INotifyPropertyChanged', а не' INotifyPropertyChanging'. – BradleyDotNET

+0

Nice catch @BradleyDotNET ... –

+0

Ах, конечно, должно быть, что, спасибо! –

ответ

0

Вы можете использовать метод Item класса ObservableCollection.

Так правильный путь для реализации этого

this.ChessBoardd.IteamsSource[0].Posx_ = 50; 

является:

this.ChessBoardd.IteamsSource.Item(0).Posx_ = 50; 

Также на свойствах это хорошая оптимизация, если вы проверяете

set 
{ 
    if(value!=posy) 
    { 
     posy = value 
     PropertyChanged("PosY"); 
    } 
} 

Ох и использовать INotifyPropertyChanged вместо от INotifyPropertyChanging

+0

Еще лучше; 'ItemsSource' должен быть связан; и тогда вы никогда не получаете доступ к коллекции напрямую, вы имеете дело с связанными объектами с 'ObservableCollection'. – BradleyDotNET

+0

Спасибо за ответ! Не получилось this.ChessBoardd.IteamsSource.Item работать, однако, мой визуал не смог найти элемент по какой-то причине. Не удалось найти его на странице msdn либо для источника товаров. Нашел ли душа, которая действительно работала для меня, я добавил «public ObservableCollection x {get; set;}», а затем просто x.add (new chesspiece() {values}); то я могу изменить, но я хочу :) –

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