[英]How to change the Datatemplate which is used for CellTemplate of the GridViewColumn
How to change the Datatemplate which is used for CellTemplate of the GridViewColumn want to change to other datatemplate so that user can edit the value of the first column only when particular row is selected and focus is on textbox 如何更改用于GridViewColumn的CellTemplate的Datatemplate想要更改为其他datatemplate,以便仅当选中特定行并且焦点位于文本框上时,用户才可以编辑第一列的值
I have created a sample app to reproduce the problem. 我创建了一个示例应用程序来重现该问题。
Here is the code in xaml file: 这是xaml文件中的代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication1">
<Window.Resources>
<Style TargetType="{x:Type TextBox}" >
<Setter Property="BorderThickness" Value="0"/>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="IsReadOnly" Value="False" />
</Trigger>
<Trigger Property="IsFocused" Value="False">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=Background}"/>
<Setter Property="IsReadOnly" Value="True" />
</Trigger>
<Trigger Property="IsReadOnly" Value="False">
<Setter Property="Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="DefaultTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="EditableTemplate">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
<Style x:Key="ListViewStyle" TargetType="{x:Type ListView}">
<Setter Property="View">
<Setter.Value>
<GridView >
<GridViewColumn Header="Name" CellTemplate="{StaticResource DefaultTemplate}"/>
<GridViewColumn Header="Age">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Age}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel>
<ListView x:Name="FoldersListView" Margin="3" SelectionMode="Single" ItemsSource="{Binding Path=ObjectCollection}"
IsSynchronizedWithCurrentItem="True" Style="{StaticResource ListViewStyle}">
</ListView>
</StackPanel>
</Window>
Below is in xaml.cs file 下面是xaml.cs文件中
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
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.Navigation;
using System.Windows.Shapes;
namespace WpfApplication1
{
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (null != PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public testVM VM = new testVM();
public MainWindow()
{
InitializeComponent();
this.DataContext = VM;
}
}
public class testVM : ViewModelBase
{
List<emplyee> myProperty = new List<emplyee>();
private string _title;
public string Title
{
get { return _title; }
set
{
_title = value;
RaisePropertyChanged("Title");
}
}
public testVM()
{
objectCollection.Add(new emplyee() { Name = "aaa India",Age="10" });
objectCollection.Add(new emplyee() { Name = "bbb India",Age="20" });
objectCollection.Add(new emplyee() { Name = "ccc India",Age="30" });
objectCollection.Add(new emplyee() { Name = "ddd India",Age="40" });
}
public List<emplyee> MyProperty { get{return myProperty;} }
private ObservableCollection<emplyee> objectCollection = new ObservableCollection<emplyee>();
public ObservableCollection<emplyee> ObjectCollection
{
get
{
return objectCollection;
}
set
{
objectCollection = value;
}
}
}
public class emplyee
{
public emplyee()
{
}
public string Name { get; set; }
public string Age { get; set; }
}
}
How to select the datatemplate dynamically? 如何动态选择数据模板?
For selecting data templates dynamically, use the DataTemplateSelector class. 要动态选择数据模板,请使用DataTemplateSelector类。 You must override its SelectTemplate method. 您必须重写其SelectTemplate方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.