WPF ListBoxItems с DataTemplates - Как я ссылаюсь на Объект CLR, связанный с ListBoxItem из DataTemplate?

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

create view A_B as

выберите идентификатор, значение даты из таблицы A, объединение выберите идентификатор, значение даты из таблицы B;

9
задан Naser Asadi 14 January 2013 в 21:06
поделиться

2 ответа

Вообще говоря, людям будет интересен объект CLR, напрямую связанный с ListBoxItem , а не фактический ListBoxItem . Например, если у вас есть список сообщений, вы можете использовать существующий шаблон:

<DataTemplate x:Key="postBody" TargetType="{x:Type Post}">
  <Grid>
    <TextBlock Text="{Binding Path=author}"/>
    <Button Click="DeleteButton_Click">Delete</Button>
  </Grid>
</DataTemplate>
<ListBox ItemTemplate="{StaticResource postBody}" 
  ItemSource="{Binding Posts}"/>

и в своем коде, ваш

  • кнопка DataContext будет равна вашему ] DataTemplate DataContext . В этом случае Пост .

    private void DeleteButton_Click(object sender, RoutedEventArgs e){
      var post = ((Button)sender).DataContext as Post;
      if (post == null)
        throw new InvalidOperationException("Invalid DataContext");
    
      Console.WriteLine(post.author);
    }
    
  • 12
    ответ дан 4 December 2019 в 13:49
    поделиться

    У вас есть несколько возможностей, в зависимости от того, что вам нужно сделать.

    Во-первых, главный вопрос: « зачем вам это"? В большинстве случаев нет реальной необходимости использовать ссылку на элемент контейнера (не говоря уже о вашем случае, но вы должны уточнить). Если вы связываете данные со своим списком, это редко встречается.

    Во-вторых, вы можете получить элемент из списка, используя myListBox.ItemContainerGenerator.ContainerFromItem () , если ваш список имен имеет имя MyListBox . Из параметра отправителя вы можете получить обратно фактический элемент, который был шаблонизирован, например (где XXX - это тип данных, привязанных к вашей базе данных):

    Container = sender as FrameworkElement;
    if(sender != null)
    {
        MyItem = Container.DataContext as XXX;
        MyElement = MyListBox.ItemContainerGenerator.ContainerFromItem(MyItem); // <-- this is your ListboxItem.
    }
    

    Вы можете найти пример этого блог . Она использует метод индекса, но метод Item похож.

    3
    ответ дан 4 December 2019 в 13:49
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: