Каков наилучший способ включить / отключить некоторые элементы управления среди нескольких элементов управления в различных условиях? - PullRequest
1 голос
/ 11 апреля 2009

Я новичок в профессиональном программировании, пишу на C #, но думаю, что это не совсем C #. В любом случае, я хочу спросить, как лучше всего включить / отключить некоторые элементы управления среди нескольких элементов управления при различных условиях?

Допустим, есть графический интерфейс с несколькими строками, каждая из которых представляет человека. Есть также несколько кнопок, представляющих некоторые действия, скажем, «Стоять, сидеть, ходить, прыгать, есть, смотреть телевизор, просыпаться, спать» и есть некоторые условия, например, если кто-то сидит, он может есть и смотреть телевизор (т.е. включить эти кнопки), но не может прыгнуть (отключить его), если кто-то стоит, он не может спать ........ и так на. Кроме того, изменение состояния не только на основе нажатия кнопки. Мол, он может просто проснуться через некоторое время или, скажем, поесть.

Кажется, что самый наивный способ - написать .Enabled = true / false; код для n состояний X m кнопок раз и проверка его для каждого изменения состояния, инициированного пользователем или не пользователем. Есть ли какой-нибудь лучший / быстрый / менее подверженный ошибкам способ сделать это?

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

Ответы [ 3 ]

2 голосов
/ 11 апреля 2009

Это будет зависеть от того, используете ли вы WPF или WinForms.

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

С WinForms, да, установка .Enabled - это путь. Самое простое - написать один метод, например, например. UpdateEnabled(), который обновляет Enabled на всех ваших элементах управления в соответствии с вашими правилами (если прыжки, то btnEat должен быть отключен), затем вызывайте этот метод всякий раз, когда изменяется состояние.

Поскольку не все изменения состояния являются реакцией на события GUI, вам, вероятно, нужен объект модели, который поддерживает состояние и генерирует событие при каждом изменении состояния. Затем, когда это событие запускается, вы можете вызвать метод UpdateEnabled() для обновления графического интерфейса на основе нового состояния.

Если ваши потребности просты, это все, что вам нужно сделать. Если ваше приложение усложняется, вы захотите взглянуть на шаблоны, такие как Model-View-Presenter - Presenter - это класс, который на основе текущего состояния знает, какие действия включены, а какие отключены.

2 голосов
/ 11 апреля 2009

Я бы привязал свойства Enabled к Can* (CanWalk, CanJump и т. Д.) Свойств класса, реализовал INotifyPropertyChanged и проверял каждое потенциально затрагиваемое свойство при изменении состояния объекта. 1006 *

Преимуществом этого метода является класс Person, и пользовательскому интерфейсу не нужно ничего знать друг о друге. Кроме того, реализация INotifyPropertyChanged устраняет лишний опрос свойств класса после каждого изменения состояния.

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

Например:

partial class Person : INotifyPropertyChanged
{
    bool _IsSleeping, _IsSitting;

    public bool IsSleeping 
    { 
        get { return _IsSleeping; } 
        set 
        {
            if(_IsSleeping != value)
            {
                _IsSleeping = value;
                OnIsSleepingChanged();
            }
        }
    }

    public bool IsSitting 
    { 
        get { return _IsSitting; } 
        set 
        {
            if(_IsSitting != value)
            {
                _IsSitting = value;
                OnIsSittingChanged();
            }
        }
    }

    protected virtual void OnIsSleepingChanged()
    {
        NotifyPropertyChanged("IsSleeping");
        CheckCanJumpChanged();
    }

    protected virtual void OnIsSittingChanged()
    {
        NotifyPropertyChanged("IsSitting");
        CheckCanJumpChanged();
    }

    bool CanJump_Old;
    public bool CanJump { get { return !(IsSleeping || IsSitting); } }

    void CheckCanJumpChanged()
    {
        if(CanJump != CanJump_Old)
        {
            CanJump_Old = CanJump;
            NotifyPropertyChanged("CanJump");
        }
    }

    //INotifyPropertyChanged helper method
    private void NotifyPropertyChanged(String prop)
    {
        var hand = PropertyChanged;
        if (hand != null)
            hand(this, new PropertyChangedEventArgs(prop));
    }
}
1 голос
/ 11 апреля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...