Привязка данных WPF: как определяется изменение элемента? - PullRequest
0 голосов
/ 01 августа 2011

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

По сути, у меня WPC UserControl с кучей ComboBox, каждыйприкован друг к другу.Я имею в виду, что первый комбинированный список заполнен некоторыми элементами, а когда пользователь выбирает элемент, второй комбинированный список заполняется элементами, основанными на предыдущем выборе, и так далее с другим комбинированным списком.Все поля со списком связаны с UpdateSourceTrigger = LostFocus.

Код для свойства ItemsSource комбо выглядит так:

    private ICollectionView allTicketTypesView;
    public IEnumerable<TicketTypeBase> AllTicketTypes
    {
        get { return this.allTicketTypesView.SourceCollection.Cast<TicketTypeBase>(); }
        private set
        {
            IEnumerable<TicketTypeBase> enumerable = value ?? new TicketTypeBase[0];
            ObservableCollection<TicketTypeBase> source = new ObservableCollection<TicketTypeBase>(enumerable);
            this.allTicketTypesView = CollectionViewSource.GetDefaultView(source);
            this.OnPropertyChanged("AllTicketTypes");
        }
    }

Код для свойства SelectedItem комбо похож на этоткод:

private TicketTypeBase ticketType;
public TicketTypeBase TicketType
{
    get { return this.ticketType; }
    set
    {
        this.ticketType = value;
        this.OnPropertyChanged("TicketType");
        this.UpdateConcessions();
    }
}    

У меня возникла небольшая проблема: когда я перемещаюсь с клавиатурой и / или мышью над комбо, я вижу, что часто измененный свойство вызывается также, когда я фактически не изменяюпункты списка.Я имею в виду, что комбо заполнено элементами, и выбран элемент: перемещение по комбо с помощью клавиатуры вызывает изменение свойства (и позволяет обновлять другое комбо, что является непопулярным поведением), но сам элемент такой же,Я вижу это поведение в выпадающем списке, который связан со списком строк (поэтому я полагаю, что при реализации Equals / GetHashCode ошибки не возникает), и такое поведение происходит каждый раз, кроме первого раза.

Я исправил код с помощьюэто:

    private string category;
    public string Category
    {
        get { return this.category; }
        set
        {
            bool actuallyChanged = !String.Equals(this.category, value);
            this.category = value;
            this.OnPropertyChanged("Category");

            if (!actuallyChanged)
            {
                string format = String.Format("Category '{0}' isn't changed actually", value);
                Trace.WriteLine(format);
            }
            else this.UpdateTicketTypes():
        }
    }

Но, конечно, мне не нравится этот код, который добавляет логику в сеттеры.

Есть какие-нибудь предложения о том, как избежать такого поведения?Я надеюсь быть ясным, и я готов лучше объяснить мою проблему, если кто-то не понимает ясно.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

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

private string category;
public string Category
{
    get { return this.category; }
    set
    {
        // check this is a new value
        if(Object.Equals(this.category, value))
            return;

        // set the value
        this.category = value;
        // raise change notification
        this.OnPropertyChanged("Category");
        // compute related changes
        this.UpdateTicketTypes():
    }
}
0 голосов
/ 01 августа 2011

Просто предположение, но можно ли реализовать привязку SelectedValue вместо SelectedItem? SelectedValue (для типов значений, таких как int, string, bool и т. Д.) Не обновляется при фокусировке клавиатуры или мыши и даже при изменении ItemsSource (с CollectionView), поскольку уведомления об изменениях в источнике (или модели) не запускаются, поскольку типы значений не изменяются по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...