Твоего образца недостаточно для воспроизведения на моем ПК, но вот что я бы исправил в первую очередь:
- Привязки в DataTemplate отсутствуют, "Mode = TwoWay", если вы хотите, чтобы свойство Enabled было установлено в вашем PanelItem
(- Привязке ItemsSource не требуется Mode = TwoWay, но это второстепенная деталь)
- DataContext ItemTemplate является экземпляром PanelItem, поэтому привязка команды Check кажется неправильной: в PanelItem отсутствует свойство Check. Привязка должна быть:
my: Checked.Command = "{Binding ElementName = MyListBox, Path = DataContext.Check}
Подобные вещи всегда сложно отлаживать. Посмотрите на окно вывода VS; там отображаются ошибки привязки (путь не найден). Когда у вас есть обратный вызов изменения DP (например, OnSetCommandCallback), точка останова сообщит вам, как прошла привязка.
Редактировать: добавлено после 1-го комментария (поскольку я не могу использовать функцию комментариев на ПК, которую я должен использовать сейчас)
Свойство Присоединенная команда определено как тип CheckBox в классе Checked, но свойство Check в виртуальной машине является DelegateCommand. Я согласен с WPF в отношении несоответствия типов :-)
Объявление свойства выглядит так:
public static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached(
"Command", typeof( CheckBox ),
typeof( Checked ), new PropertyMetadata( OnSetCommandCallback ) );
Вторым параметром должен быть тип свойства, так что я думаю, что-то вроде ICommand в вашем случае.
Из любопытства: в OnSetCommandCallback вас не волнует значение, установленное для свойства Command (которое находится в e.NewValue). Как вы связываете экземпляр CheckedBehavior со свойством Check виртуальной машины?
Редактировать после второго комментария:
Нет, второй абзац выше не имеет отношения к вашему вопросу. Может быть, это не имеет смысла. Я не могу понять роль CheckedBehavior.
По поводу вопроса, какой пункт отмечен / не отмечен: что вам нужно более точно? У вас есть экземпляр PanelItem, чье свойство Enabled устанавливается в значение true или false через связывание; таким образом, отмеченные элементы имеют значение Enabled = true.
Редактировать после третьего комментария:
Спасибо за объяснение ваших потребностей. Вы на самом деле не используете параметр пути привязки к присоединенному свойству, вы можете написать:
my:Checked.Command="{Binding}"
Таким образом, e.NewValue является связанным PanelItem в OnSetCommandCallback. Таким образом, его можно передать экземпляру CheckedBehavior (в его конструкторе), который может переслать его при вызове Execute of ICommand.