ToggleButton привязка - PullRequest
       18

ToggleButton привязка

0 голосов
/ 21 июля 2010

Если у меня есть Коллекция, привязанная к n тумблерам в панели стека в пользовательском контроле .... как я могу обновить базовую Коллекцию без кода позади (включая события Checked и unchecked) и полную логику обновления

Спасибо

U.

Ответы [ 3 ]

2 голосов
/ 21 июля 2010

Ваш вопрос неопределенный, но я ценю это (коммерческие вещи). Поэтому мы можем только догадываться, в чем может быть проблема.

Я буду стараться изо всех сил ...

Звучит так, как будто вы хотите семь кнопок ToggleButton, каждая кнопка активирует / деактивирует день недели. У вас есть коллекция из 7 булевых значений. Каждое свойство IsChecked объекта ToggleButton связано с логическим значением в коллекции.

Проблема в том, что в данный момент вы пытаетесь изменить объект в коллекции, а не просто свойство этого объекта. Я не знаю, поддерживается ли в ObservableCollection прямая замена элементов в определенных позициях или нет, но вполне возможно, что инфраструктура привязки WPF не поддерживает прямую замену объектов в коллекциях. Вы можете добавлять и удалять предметы, но не делать прямые свопы в определенных позициях.

Однако вы можете обойти это (возможное) ограничение.

Попробуйте создать новый класс, который реализует INotifyPropertyChanged следующим образом:

class BooleanWrapper : INotifyPropertyChanged
{
  private Boolean isSelected;
  public Boolean IsSelected
  { 
    get { return isSelected; }
    set
    {
      if (isSelected != value)
      {
        isSelected = value;
        // TODO: Raise PropertyChanged event.
      }
    }
  }
}

(Если вы не знакомы с INotifyPropertyChanged, это довольно просто - на MSDN есть множество примеров. Это позволяет инфраструктуре привязки обнаруживать изменения свойств)

Вместо наличия ObservableCollection , есть ObservableCollection . Каждое свойство IsChecked объекта ToggleButton должно быть связано со свойством IsSelected объекта BooleanWrapper.

Теперь вы не пытаетесь поменять объекты внутри и из коллекции, вы просто обновляете значение свойства объекта в коллекции.

В качестве примечания: если вы привязываетесь только к дням недели, по моему мнению, нет ничего плохого в привязке к классу, подобному:

class DaySelection : INotifyPropertyChanged
{
  public Boolean IsMondaySelected { ... }
  public Boolean IsTuesdaySelected { ... }
  ...
}

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

Надеюсь, я что-то понял!

0 голосов
/ 21 июля 2010

Чтобы использовать коллекцию для привязки, вам нужно проверить ObservableCollection<T> ( ссылка MSDN ). Используя это, вы должны подписаться на большую часть обязательной привязки, которую вы ищете автоматически. Однако если вы используете для своих объектов что-то отличное от bool, вам придется реализовать INotifyPropertyChanged для любого объекта, с которым вы решили связать.

0 голосов
/ 21 июля 2010

Взгляните на TwoWay режим привязки.Это позволит обновлять базовые бизнес-объекты пользовательским интерфейсом, а также обновлять пользовательский интерфейс базовыми бизнес-объектами.

...