none
DataGridTextColumnのソースを確認したい RRS feed

  • 質問

  • いつもお世話になっております。
    毎回低レベルな質問ばかりで申し訳無いですが、今回もよろしくお願いいたします。

    DataGridTemplateColumnでDataGridTextColumnと全く同じ動き+αを作りたいのですが、
    DataGridTextColumnのソースを確認できる手段は無いでしょうか?
    DataGridTemplateColumnで自作しても、F2押下時にTextBox内にフォーカスが移動してくれません。

    <DataGridTemplateColumn Header="テスト">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate >
                <TextBlock Text="{Binding  TestJikan}" >
                </TextBlock>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <TextBox  Text="{Binding  TestJikan}" >
                    <i:Interaction.Behaviors>
                        <be:FocusMoveBehavior IsNumeric="True" />
                    </i:Interaction.Behaviors>
                </TextBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>

    やりたいことはDataGridのセルを編集する際にビヘイビアを入れたいだけなので、
    わざわざDataGridTemplateColumnで作らなくとも、
    DataGridTextColumn用にBehaviorを作ることができれば一番良いのですが
    作り方が分かりませんでした・・・

    読み辛い文章で申し訳ありません。よろしくお願いします。

    環境
    VisualStudio2010、WPF、C#、Livet


    2012年4月23日 9:30

回答

  • DataGridTextColumnのソースの見方はわからないですが、こんな感じで近い動きにできました。

    まず、初期状態でフォーカスをあてて全選択状態にするビヘイビアを定義します。

    public class DataGridCellTextBoxBehavior : Behavior<TextBox>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.Loaded += AssociatedObject_Loaded;
        }
    
        private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
        {
            this.AssociatedObject.Focus();
            this.AssociatedObject.SelectAll();
        }
    
        protected override void OnDetaching()
        {
            this.AssociatedObject.Loaded -= AssociatedObject_Loaded;
            base.OnDetaching();
        }
    }
    

    あとは、XAMLでDataGridTemplateColumnに設定したTextBoxの余分な余白の除去と上記で作ったビヘイビアを仕込みます。

    <DataGridTemplateColumn Header="AAAA">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <TextBox Name="textBox" Text="{Binding Name, Mode=TwoWay}" BorderThickness="0" MinHeight="0" Padding="0">
                    <i:Interaction.Behaviors>
                        <local:DataGridCellTextBoxBehavior />
                    </i:Interaction.Behaviors>
                </TextBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
    

    こんな感じでどうでしょう

    かずき Blog:http://d.hatena.ne.jp/okazuki/

    • 回答としてマーク dar4301 2012年5月7日 5:14
    2012年5月3日 15:47

すべての返信

  • DataGridTextColumnのソースの見方はわからないですが、こんな感じで近い動きにできました。

    まず、初期状態でフォーカスをあてて全選択状態にするビヘイビアを定義します。

    public class DataGridCellTextBoxBehavior : Behavior<TextBox>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.Loaded += AssociatedObject_Loaded;
        }
    
        private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
        {
            this.AssociatedObject.Focus();
            this.AssociatedObject.SelectAll();
        }
    
        protected override void OnDetaching()
        {
            this.AssociatedObject.Loaded -= AssociatedObject_Loaded;
            base.OnDetaching();
        }
    }
    

    あとは、XAMLでDataGridTemplateColumnに設定したTextBoxの余分な余白の除去と上記で作ったビヘイビアを仕込みます。

    <DataGridTemplateColumn Header="AAAA">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <TextBox Name="textBox" Text="{Binding Name, Mode=TwoWay}" BorderThickness="0" MinHeight="0" Padding="0">
                    <i:Interaction.Behaviors>
                        <local:DataGridCellTextBoxBehavior />
                    </i:Interaction.Behaviors>
                </TextBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
    

    こんな感じでどうでしょう

    かずき Blog:http://d.hatena.ne.jp/okazuki/

    • 回答としてマーク dar4301 2012年5月7日 5:14
    2012年5月3日 15:47
  • 返信が遅れて申し訳ありません。
    完璧で何も言うことがありません!ありがとうございました。
    2012年5月7日 5:27