2013-07-22 5 views
0

У меня есть шаблон данных в WPF, который привязан к классу ResultsViewModel и отображает виртуальную машину в формате таблицы. Буква из них составляет ListBoxItems в ListBox. Я хочу, чтобы в каждой отдельной таблице было немного X в верхней правой части границы, где, если вы нажмете на нее, она вызывает функцию, которая удаляет этот элемент из списка.WPF гиперссылка в datatemplate listboxitem

Я попытался использовать гиперссылку и событие OnClick, но тогда у меня должен быть DataTemplate в основном XAML, а не в словаре ресурсов, так как ему нужен топор: метка класса для использования событий, но затем событие запускается в MainViewModel, который не является наихудшей вещью в мире, поскольку наблюдаемый список хранится в MainViewModel и в любом случае его нужно удалить в этом месте, но я не могу понять, как получить ссылку на ResultsViewModel в окне списка элемент, который содержал шаблон данных, которая была нажата

<DataTemplate x:Key="ErroredResultsTemplate" DataType="x:Type vm:ResultsViewModel" > 
     <Border x:Name="Border" BorderBrush="{StaticResource ResultProcessedBorder}" Background="{StaticResource ResultFill}" BorderThickness="4" CornerRadius="10" Margin="6" Padding="5" Width="110" Height="110"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="20" /> 
        <RowDefinition Height="83" /> 
       </Grid.RowDefinitions> 
       <TextBlock Grid.Row="0" Foreground="{StaticResource ResultGrayText}" FontWeight="Bold" HorizontalAlignment="Right" VerticalAlignment="Top"> 
       <Hyperlink Click="Close_Results">X</Hyperlink> 
       </TextBlock> 
       <TextBlock Width="90" Text="An error occurred calculating results" TextWrapping="Wrap" Foreground="{StaticResource ResultGrayText}" FontWeight="Bold" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Top" TextAlignment="Center" /> 
      </Grid> 
     </Border> 
    </DataTemplate> 
+1

Вместо Гиперссылки с обработчиком события, почему бы вам не использовать 'Button' с командой, и пусть эта команда постоянно находиться там, где вы хотите (используйте RelativeSource FindAncestor в ListBox, если вы хотите получить доступ к Команде из DataContext ListBox) и установить 'CommandParameter' команды как' {Binding Path = DataContext, RelativeSource = {RelativeSource Self}} ' – Viv

ответ

1

Вы можете достичь этого двумя способами:

  1. Создайте свойство типа ResultsViewModel в модели родительского вида (который содержит коллекцию объектов ResultsViewModel) и связать это с SelectedItem свойства вашего ListBox. Добавьте какой-то RelayCommand в родительскую модель представления для обработки действия удаления, добавьте Button в ваш DataTemplate и привяжите его свойство Command к новой команде. Затем, при нажатии любой кнопки удаления, вы можете просто удалить элемент, найденный в свойстве SelectedItem, из вашей коллекции, и пользовательский интерфейс должен соответствующим образом обновиться (при условии, что вы реализовали интерфейс INotifyPropertyChange).

  2. Вы можете просто связать с DataTemplate каждого элемента в ListBox прямо на родительскую модель. Это предполагает, что у вас есть Command в вашей модели представления родительского именем Delete и что модель родитель вида связана с DataContext имущества Window или UserControl что ListBox появляется в. Также обратите внимание на важную CommandParameter="{Binding}" часть, которая проходит объект данных от каждого элемент в коллекции к параметру object в Command, когда вызывается Command.

Пример:

<Button Content="X" Command="{Binding DataContext.Delete, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    XmlNameSpace:WindowOrUserControlName}}, Mode=OneWay}" 
    CommandParameter="{Binding}" />