ОК, я думаю, что ответил на свой вопрос:
Решение, похоже, заключается в использовании «вложенных» ViewModels здесь:
Другими словами, вместо того, чтобы мой ListBox связывался непосредственно с коллекцией DTO / бизнес-объектов (как я делал выше), я вместо этого создал простую ViewModel для обертывания каждого DTO, и команда it , а не на оригинальной ВМ верхнего уровня.
Итак, связанная коллекция теперь выглядит так:
TestItems = new ObservableCollection<ItemVM> ()
{
new ItemVM(),
new ItemVM(),
new ItemVM()
};
И каждый ItemVM просто оборачивает DTO и имеет команду:
public class ItemVM : INotifyPropertyChanged
{
public ItemVM ()
{
this.MyCommand = new DelegateCommand<string> ( TheCommand );
}
public ICommand MyCommand { get; private set; }
public MyBusinessObject BizObj;
}
И вуаля, нет необходимости в RelativeSource, и у нас есть многократно используемый шаблон с командами.