Как связать Button в шаблоне данных Silverlight ListItem, в ResourceDictionary (Styles.xaml), с обработчиком? - PullRequest
3 голосов
/ 22 января 2010

ОК, поэтому я определяю шаблон ItemTemplate для ListBox в ResourceDictionary (Styles.xaml). Шаблон ListBoxItem выглядит примерно так:

<ControlTemplate TargetType="ListBoxItem">
    <Button Command="{Binding Path=DoSomeCommand}" Content="Test"  />
</ControlTemplate>

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

Однако это не работает как есть, я также попробовал это:

<ControlTemplate TargetType="ListBoxItem">
    <Button Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DoSomeCommand}" Content="Test"  />
</ControlTemplate>

Но все еще нет игры в кости.

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 января 2010

ОК, я думаю, что ответил на свой вопрос:

Решение, похоже, заключается в использовании «вложенных» 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, и у нас есть многократно используемый шаблон с командами.

0 голосов
/ 23 января 2010

Длинный ответ: Ссылка на TextBox внутри шаблона данных

Краткий ответ: используйте Prism Commands или Blend Behaviors.

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