2012-01-10 3 views
0

WPF DataGrid를 사용하고 있습니다. 행 헤더 및 열 머리글에 대한 컨텍스트 메뉴를 제공하고 있습니다. 아래에 언급 한 바와 같이 코드 :DataGrid에서 선택한 열 찾기

MainWindow.xaml

<Window x:Class="WpfApplication10.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cmd="clr-namespace:WpfApplication10" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.Resources> 
     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="ContextMenu"> 
       <Setter.Value> 
        <ContextMenu> 
         <MenuItem Header="Insert Column Before" Command="cmd:ContextMenuCustomCommands.InsertColumnBeforeCommand" /> 
         <MenuItem Header="Insert Column After" Command="cmd:ContextMenuCustomCommands.InsertColumnAfterCommand"/> 
        </ContextMenu> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style TargetType="{x:Type DataGridRowHeader}"> 
      <Setter Property="ContextMenu"> 
       <Setter.Value> 
        <ContextMenu> 
         <MenuItem Header="Delete" Command="Delete"/> 
        </ContextMenu> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 
    <Grid.CommandBindings> 
     <CommandBinding Command="cmd:ContextMenuCustomCommands.InsertColumnBeforeCommand" CanExecute="InserColumnBefore_CanExecute" Executed="InserColumnBefore_Executed"/> 
     <CommandBinding Command="cmd:ContextMenuCustomCommands.InsertColumnAfterCommand" CanExecute="InsertColumnAfter_CanExecute" Executed="InsertColumnAfter_Executed"/> 
    </Grid.CommandBindings> 
    <DataGrid x:Name="grdEmployee" ItemsSource="{Binding}" AutoGeneratingColumn="grdEmployee_AutoGeneratingColumn" LoadingRow="grdEmployee_LoadingRow" SelectionUnit="CellOrRowHeader"> 

    </DataGrid> 
</Grid> 

MainWindow.xaml.cs를

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
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; 
using System.Data; 
using System.Data.SqlClient; 

namespace WpfApplication10 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
{ 
    private SqlConnection empCon = null; 
    private SqlCommand empCmd = null; 
    private DataSet empDS = null; 
    private SqlDataAdapter empAdap = null; 
    private string query = "SELECT * FROM Employees"; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.grdEmployee.ItemsSource = this.GetEmployeeData().DefaultView; 
    } 

    private DataTable GetEmployeeData() 
    { 
     try 
     { 
      empCon = new SqlConnection(Application.Current.Properties["connectionStr"].ToString()); 
      empCmd = new SqlCommand(query, empCon); 
      empAdap = new SqlDataAdapter(empCmd); 
      empDS = new DataSet(); 
      empAdap.Fill(empDS); 
     } 
     catch (SqlException sqlEx) 
     { 
     } 
     finally 
     { 
      if (empCon != null) 
       empCon.Dispose(); 

      if (empCmd != null) 
       empCmd.Dispose(); 
     } 

     if (empDS != null) 
     { 
      for (int count = 1; count <= empDS.Tables[0].Columns.Count; count++) 
      { 
       empDS.Tables[0].Columns[count - 1].ColumnName = Utility.ConvertNumber(count).ToString(); 
      } 
      return empDS.Tables[0]; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    private void grdEmployee_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 

    } 

    private void grdEmployee_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     e.Row.Header = (e.Row.GetIndex() + 1).ToString(); 
    } 

    private void InserColumnBefore_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

    private void InserColumnBefore_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 

    } 

    private void InsertColumnAfter_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

    private void InsertColumnAfter_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 

    } 
    } 

    public class Utility 
{ 
    private static string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    public static string ConvertNumber(int number) 
    { 
     string result; 
     number -= 1; 
     int rest = number % 26; 
     int q = number/26; 
     if (q == 0) 
     { 
      result = chars[rest].ToString(); 
     } 
     else 
     { 
      result = ConvertNumber(q) + chars[rest]; 
     } 
     return result; 
    } 
    } 

public static class ContextMenuCustomCommands 
{ 
    public static readonly RoutedUICommand InsertColumnBeforeCommand = new RoutedUICommand("Insert Column Before", "Insert Column Before", typeof(MainWindow)); 
    public static readonly RoutedUICommand InsertColumnAfterCommand = new RoutedUICommand("Insert Column After", "Insert Column After", typeof(MainWindow)); 
} 
} 

App.xaml.cs를

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Windows; 

namespace WpfApplication10 
{ 
    /// <summary> 
    /// Interaction logic for App.xaml 
    /// </summary> 
    public partial class App : Application 
    { 
     public App() 
    { 
     string connectionStr = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=(local);"; 
     Application.Current.Properties["connectionStr"] = connectionStr; 
    } 
} 
}

문제는 다음과 같습니다. 컨텍스트 메뉴에서 주어진 열을 삽입 할 때 사용자가 이벤트를 제기 한 열 머리글을 알아야합니다.

답변

2

ContextMenu.PlacementTarget은 열 머리글이므로 CommandParameter을 바인딩하여 명령에 사용할 수 있습니다.

CommandParameter="{Binding PlacementTarget, 
          RelativeSource={RelativeSource AncestorType=ContextMenu}}" 
+0

감사합니다. 그것은 작동 중입니다 ... 굉장 :) :) –

+0

@PriyankThakkar : 도와 줘서 고맙군요. :) –