ListView 套用 CellTemplate 根据焦点获取行选中信息 获取 Template内控件
點擊會默認選擇這一行,但是如果點擊這一列使用了contentTemplate,則不會
<Window x:Class="WpfDemo.HierarchicalDataTemplateDemo1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfDemo" xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" Title="HierarchicalDataTemplateDemo1" Height="261" Width="335"> <Window.Resources> <c:ArrayList x:Key="list"> <local:StudentItem id="1" name="張三" age="10" isman="True"></local:StudentItem> <local:StudentItem id="2" name="李四" age="20" isman="False"></local:StudentItem> <local:StudentItem id="3" name="王五" age="30" isman="True"></local:StudentItem> <local:StudentItem id="4" name="孫六" age="40" isman="False"></local:StudentItem> <local:StudentItem id="5" name="周七" age="50" isman="True"></local:StudentItem> <local:StudentItem id="6" name="趙四" age="60" isman="True"></local:StudentItem> <local:StudentItem id="7" name="錢八" age="70" isman="False"></local:StudentItem> </c:ArrayList> <DataTemplate x:Key="dtname"> <TextBox Text="{Binding name}" x:Name="tb1" GotFocus="TextBox_GotFocus"></TextBox> </DataTemplate> <DataTemplate x:Key="dtage"> <TextBox Text="{Binding age}" x:Name="tb2"></TextBox> </DataTemplate> <DataTemplate x:Key="deisman"> <CheckBox IsChecked="{Binding isman}" x:Name="ck1"></CheckBox> </DataTemplate> </Window.Resources> <Grid Margin="5"> <ListView ItemsSource="{StaticResource list}" x:Name="listViewStu"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding id}"></GridViewColumn> <GridViewColumn Header="Name" CellTemplate="{StaticResource dtname}"></GridViewColumn> <GridViewColumn Header="Age" CellTemplate="{StaticResource dtage}"></GridViewColumn> <GridViewColumn Header="IsMan" CellTemplate="{StaticResource deisman}"></GridViewColumn> </GridView> </ListView.View> </ListView> </Grid> </Window>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Xml; namespace WpfDemo { /// <summary> /// HierarchicalDataTemplateDemo1.xaml 的互動邏輯 /// </summary> public partial class HierarchicalDataTemplateDemo1 : Window { public HierarchicalDataTemplateDemo1() { InitializeComponent(); } private void Grid_Click(object sender, RoutedEventArgs e) { //MenuItem item = e.OriginalSource as MenuItem; //XmlElement xe = item.Header as XmlElement; //MessageBox.Show(xe.Attributes["Name"].Value+ xe.Attributes["Gesture"].Value); } private void Button_Click(object sender, RoutedEventArgs e) { //var t=this.uc.ContentTemplate.FindName("t1",uc) as TextBlock; //MessageBox.Show(t.Text); //var stu = this.uc.Content as Employee; // 获取 DataTemplate 绑定的 内容 //MessageBox.Show(stu.name+" "+stu.age); } public T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject { try { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) { return child as T; } else { T childOfChildren = FindVisualChild<T>(child); if (childOfChildren != null) { return childOfChildren; } } } return null; } catch (Exception ee) { MessageBox.Show(ee.Message); return null; } } private void TextBox_GotFocus(object sender, RoutedEventArgs e) { //獲取內容 var t=e.OriginalSource as TextBox; var ct=t.TemplatedParent as ContentPresenter; var item = ct.Content as StudentItem; // 點擊會默認選擇這一行,但是如果點擊這一列使用了contentTemplate,則不會 this.listViewStu.SelectedItem = item; //MessageBox.Show(item.id+""+item.name+""+item.age+""+item.isman); //獲取 選中這行裡面的控件 屬性 ListViewItem viewItem= this.listViewStu.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem; var cb=FindVisualChild<CheckBox>(viewItem); MessageBox.Show(cb.Name); } } public class StudentItem { public int id { get; set; } public string name { get; set; } public int age { get; set; } public bool isman { get; set; } } }