【问题标题】:How can I get an element from within a ListViewItem's ItemTemplate?如何从 ListViewItem 的 ItemTemplate 中获取元素?
【发布时间】:2021-03-14 18:57:36
【问题描述】:

我有一个ListView,它使用了一个自定义的ItemTemplate(不是每个人吗?):

<ListView>
  <!-- ... -->
  <ListView.ItemTemplate>
    <DataTemplate x:DataType="x:String">
      <MyGreatControl Thing="{x:Bind}" />
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

MyGreatControl 今天内置了大量的键盘处理代码,但由于一些重构,我需要将实际的处理程序移动到 ListView 本身。但是,我不想将MyGreatControl 中的所有代码移动到ListView(出于多种原因)。

如果我有一个任意的ListViewItem(例如I can get from an event handler),我如何在其DataTemplate 中访问MyGreatControl 实例?

MyGreatControl^ GetMyGreatControlFromListViewItem(ListViewItem^ listViewItem) {
    // ???
}

【问题讨论】:

    标签: c++ uwp winrt-xaml c++-cx


    【解决方案1】:

    你想使用ContentTemplateRoot

    MyGreatControl^ GetMyGreatControlFromListViewItem(ListViewItem^ listViewItem) {
      return safe_cast<MyGreatControl^>(listViewItem->ContentTemplateRoot);
    }
    

    这也适用于任意元素——例如,如果您有一个 StackPanel,ContentTemplateRoot 将返回您想要的 StackPanel 实例:

    <ListView.ItemTemplate>
      <DataTemplate x:DataType="x:String">
        <StackPanel><!-- This is what you get! -->
          <TextBlock Text="{x:Bind}" />
          <Button Content="Foo" IsTabStop="False" />
        </StackPanel>
      </DataTemplate>
    </ListView.ItemTemplate>
    

    然后您可以使用普通的可视化树导航来查找儿童等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多