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方法。

相關問題