2014-11-14 52 views
0

如何更改用于GridViewColumn的CellTemplate的数据模板想要更改为其他数据模板,以便用户只能在特定行时编辑第一列的值被选中并且重点放在文本框上如何更改用于GridViewColumn的CellTemplate的数据模板

我已经创建了一个示例应用程序来重现该问题。

这里是在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> 

下面是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; } 

    } 
} 

如何动态地选择DataTemplate中?

回答

0

要动态选择数据模板,请使用DataTemplateSelector类。您必须重写其SelectTemplate方法。