wpf-подобный триггер в коде позади

Я пишу простую игру на С#, используя wpf. В моем xaml.cs я создаю объект Game, который выполняет всю работу.

Мне нужно иметь возможность перезагрузить окно для определенного свойстваChange в игровом объекте. У меня уже есть это в моем xaml:

<TextBlock x:Name="PhaseTB" Text="{Binding Phase, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"/>

а Phase является частью объекта Game:

public class Game : INotifyPropertyChanged
{
    private static Game _instance;
    private GamePhase phase;

    public static Game Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Game(10, 10);
            return _instance;
        }
    }
 public GamePhase Phase
 {
     get { return phase; }
     set 
     { 
         phase = value;
         OnPropertyChanged("Phase");
     }
 }

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Все работает нормально, и текстовое поле обновляется в соответствии со значением фазы.

Мой вопрос: как мне вызывать метод всякий раз, когда изменяется значение фазы? Текст меняется просто отлично, но я понятия не имею, как вызвать метод кода программной части.

(извините за нубский вопрос. Я унаследовал код и не очень понимаю, как все это работает)


person Johan Hjalmarsson    schedule 17.12.2015    source источник
comment
В установщике фазы вы можете вызвать свой метод...   -  person Pikoh    schedule 17.12.2015
comment
@Pikoh, только если метод статичен (поскольку метод, который я хочу вызвать, находится в классе MainWindow, и у меня нет объекта для ссылки)   -  person Johan Hjalmarsson    schedule 17.12.2015


Ответы (1)


Вам необходимо подписаться на событие PropertyChanged:

`<yourDataContext>`.PropertyChanged += propertyChangedHandler;

где <yourDataContext> — ваш DataContext, а propertyChangedHandler — обработчик событий.

Примечание. Вы можете получить доступ к контексту данных следующим образом:

((Game)textBox1.DataContext).PropertyChanged += propertyChangedHandler;

or

((Game)this.DataContext).PropertyChanged += propertyChangedHandler;

если ваш TextBox наследует DataContext от основного класса окна/страницы.

Это событие существует именно для той цели, которую вы упомянули.

А что касается того, куда следует поместить этот код, я бы вообще поместил его в конструктор, так как он назначает обработчики событий:

public class MainWindow() {
    public MainWindow() {
        InitializeComponent();
        // Here go the event handlers....
    }
}

Больше информации:

person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 17.12.2015
comment
Куда бы я поместил этот код? мой textbox.DataContext не имеет .PropertyChanged - person Johan Hjalmarsson; 17.12.2015
comment
Вам нужно будет бросить его. Подождите, я обновлю ответ. - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 17.12.2015
comment
@JohanHjalmarsson А какой класс содержит phase? - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 17.12.2015
comment
Я добавлю важные части определения игры к моему вопросу - person Johan Hjalmarsson; 17.12.2015