Привязка для просмотра свойства модели из ItemsControl.ItemTemplate - PullRequest
5 голосов
/ 08 декабря 2010

У меня есть коллекция объектов и команда в моей ViewModel.

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

// View Model
public class MyViewModel : ViewModelBase
{
  // Raises PropertyChanged event, ommited here
  public List<MyClass> MyList {....}

  public RelayCommand<int> MyCommand {....}
}

Я установил DataContext моего UserControl в вышеупомянутый класс ViewModel.XAML для этого UserControl выглядит следующим образом:

<UserControl>
  <ItemsControl ItemsSource="{Binding Path=MyList}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel />
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <HyperlinkButton Content="{Binding Path=Description}" Command="{Binding Path=MyCommand}" CommandParameter="{Binding Path=MyClassID}"/>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</UserControl>

Описание для содержимого гиперссылки отображается правильно, но команда никогда не запускается, я думаю, это потому, что она ищет команду в объекте MyClass?

Как связать данные с UserControls DataContext.MyCommand, а не с MyClass.MyCommand, которую он ищет?

1 Ответ

6 голосов
/ 08 декабря 2010

К сожалению, у нас нет режима FindAncestor для расширения разметки RelativeSource, которое есть в WPF, поэтому вы не можете его использовать (это будет добавлено в Silverlight 5).Это неприятно, но вы можете дать своему элементу UserControl имя и использовать привязку ElementName для привязки к команде объекта, назначенного его DataContext.

Например:

<UserControl Name="root">

Затем связатькоманда (с использованием точечной нотации из DataContext UserControl):

Command="{Binding Path=DataContext.MyCommand, ElementName=root}"

Попробуйте.

...