2012-02-20 5 views
0

WPFデータグリッドの列の名前を変更しようとしています。私は列の名前を変更するためにユーザーにコンテキストメニューを提供しています。ユーザーが特定の列の列ヘッダーから名前を変更したら、次のコードとスタイルを使用して列ヘッダーにスタイルを適用します。スタイル内のテキストボックスのINotifyPropertyChanged

private void RenameColumn_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     if (e != null) 
     { 
      if (e.Parameter != null) 
      { 
       if ((e.Parameter as DataGridColumnHeader) != null) 
       { 
        this.DefaultColHeaderStyle = (e.Parameter as DataGridColumnHeader).Style; 
        this.RenamedColIndex = (e.Parameter as DataGridColumnHeader).DisplayIndex; 
        (this.grTestData.ColumnFromDisplayIndex(this.RenamedColIndex)).HeaderStyle = this.grTestData.Resources["RenameColumnHeader"] as Style; 
       } 
      } 
     } 
    } 

私はproperptyに、このテキストボックスをバインドしていますことは:

<Style x:Key="RenameColumnHeader" TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <Grid FocusManager.FocusedElement="{Binding ElementName=txtBxRename}"> 
           <TextBox x:Name="txtBxRename" GotFocus="txtBxRename_GotFocus" LostFocus="txtBxRename_LostFocus" KeyDown="txtBxRename_KeyDown" TextChanged="txtBxRename_TextChanged" Text="{Binding Path=NewColName,Mode=TwoWay}"/> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 

私は、プロパティNewColNameのためのINotifyPropertyChangedのインタフェースを実装している:

public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
public string NewColName 
    { 
     get 
     { 
      return this.newColName; 
     } 
     set 
     { 
      this.newColName = value; 
      this.OnPropertyChanged("NewColName"); 
     } 
    } 

それがトリガされていないプロパティ変更私はテキストボックスに入力を開始します。私は、テキストボックスの検証のためにIDataErrorInfoを実装しようとしています。私を案内してください。私のコードに関する他の情報が必要な場合は教えてください。

+0

ヘッダーのコンテキストとは何ですか?あなたは彼に何を提供しますか? –

+0

私は、DataGridをデータテーブルでバインドしており、データグリッドの自動生成カラムを使用しています。 –

答えて

2

PropertyChangedに設定する必要があります。TextBox.TextはデフォルトでLostFocusです。

+0

私もそれを試しました。それでも動作していません。 –

+0

@PriyankThakkar:バインディングは[エラー]なしで動作します(http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight -application.aspx)? –

+0

はい明らかなエラーはありません。しかし、もう一度チェックしてお知らせします。 –

0

解決済みです。

スタイル内で宣言されたコントロールをバインドするときは、ウィンドウに名前を付ける必要があります。

<Window x:Class="DataGridColumnRename.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cmd="clr-namespace:DataGridColumnRename" 
    Title="MainWindow" Height="350" Width="525" Name="Me"> 

そして、我々がElementNameのプロパティを指定し、それにwindownの名前を(この場合には、それは「私」である)割り当てる必要がスタイル内のコントロールインチ

  <Style x:Key="RenameColumnHeader" TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <Grid FocusManager.FocusedElement="{Binding ElementName=txtBxRename}"> 
           <TextBox x:Name="txtBxRename" GotFocus="txtBxRename_GotFocus" LostFocus="txtBxRename_LostFocus" KeyDown="txtBxRename_KeyDown" Text="{Binding ElementName=Me, Path=NewColName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 

次に、INotifyPropertyChangedがトリガーされます。 :) :)助けを借りてくれてありがとう。

関連する問題