Привязка к ObservableCollection.Count не обновляется при обновлении OC - PullRequest
0 голосов
/ 02 февраля 2012

EDIT: привязка работает правильно, если я удаляю Minimum="1" из XAML ... может ли это быть проблемой SL Toolkit?

Я пытаюсь связать значение NumericUpDown из Silverlight Toolkitк количеству коллекции ObservableCollection.

В конструкторе моей модели представления я добавляю элементы в коллекцию, и привязки соответственно обновляют представление.Однако значение в NumericUpDown не изменяется (оно остается равным 1).

Интересно, что если я редактирую привязку, когда дизайнер открыт и IntelliSense работает, значение обновляется до правильного значения (вконструктор).

Я что-то здесь не так сделал?

Код привязки

<toolkit:NumericUpDown x:Name="numberOfCubesUpDown" IsEnabled="True" Maximum="9" Minimum="1" Style="{StaticResource ButtonSpinnerHorizontalStyle}" Value="{Binding Path=Cubes.Count}" Height="30" FontSize="14">
  <i:Interaction.Triggers>
     <i:EventTrigger EventName="ValueChanged">
        <cmd:EventToCommand Command="{Binding ChangeNumberOfCubesCommand}" PassEventArgsToCommand="True"></cmd:EventToCommand>
     </i:EventTrigger>
  </i:Interaction.Triggers>
</toolkit:NumericUpDown>

Определение привязки ViewModel Реализация CubeSetObservableCollection

public CubeSet Cubes
    {
        get { return _cubes; }

        set
        {
            if (_cubes == value) { return; }
            _cubes = value;
        }
    }

Где я изменяю CubeSet

        Cubes = new CubeSet();
        for (int i = 0; i < 6; i++) { Cubes.Add(new Cube()); }

1 Ответ

0 голосов
/ 02 февраля 2012

Вашему классу необходимо реализовать интерфейс INotifyPropertyChanged и вызвать событие PropertyChanged в установщике.

Примерно так:

 using System.ComponentModel;

namespace Sample.ViewModels
{
    public class ViewModelBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

и ваш установщик / получатель будет выглядеть так

public CubeSet Cubes
{
    get { return _cubes; }

    set
    {
        if (_cubes == value) { return; }
        _cubes = value;

        OnPropertyChanged("Cubes");
    }
}

Если вы хотите обновить привязку, вы должны установить значение с помощью метода setter.Конечно, вы можете вручную вызвать событие OnPropertyChanged в любом месте внутри класса, и ваш View проверяет наличие обновленного значения.

Кроме того, обязательно установите режим на привязку.Я полагаю, что по умолчанию он установлен в OneWay.

РЕДАКТИРОВАТЬ: Извините, я почему-то забыл, что это ObservableCollection.Возможно, у вас неправильный DataContext.

...