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; }
    }
}

  

 

posted @ 2021-09-05 16:44  zq爱生活爱代码  阅读(70)  评论(0编辑  收藏  举报