2009-04-01 19 views
2

カスタムDataGrid列定義をUserControlに移動しようとしています。WPF分解 - DataGridTemplateColumn

MyComboBoxColumn.xaml

<dg:DataGridTemplateColumn 
    x:Class="WpfDecomposition.MyComboBoxColumn" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit" 
    x:Name="_this" 
    > 

    <dg:DataGridTemplateColumn.Header> 
     <Button Content="{Binding MyHeader, ElementName=_this}" ></Button> 
    </dg:DataGridTemplateColumn.Header> 

</dg:DataGridTemplateColumn> 

MyComboBoxColumn.cs

public partial class MyComboBoxColumn : DataGridTemplateColumn 
{ 
    public MyComboBoxColumn() 
    { 
     InitializeComponent(); 
    } 

    public static DependencyProperty MyHeaderProperty = 
     DependencyProperty.Register("MyHeader", typeof(string), typeof(MyComboBoxColumn), new PropertyMetadata("TEST")); 
} 

メインウィンドウのXAML:私は、列のヘッダーにボタン "TEST" を参照してくださいことを期待する

<dg:DataGrid CanUserAddRows="True" AutoGenerateColumns="False"> 
    <dg:DataGrid.Columns> 
     <my:MyComboBoxColumn /> 
    </dg:DataGrid.Columns> 
</dg:DataGrid> 

、代わりに空のボタンが表示されます。バインディングが壊れているように見えます。なにが問題ですか?

答えて

2

_thisという名前の要素が見つからないため、機能しません。私は、Visual Studioでコードをデバッグするとき、私は出力ウィンドウに次のエラーを取得する:それはそれを見つけることができない理由については

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=_this'. BindingExpression:Path=MyHeader; DataItem=null; target element is 'Button' (Name='TestButton'); target property is 'Content' (type 'Object')

- 私は、WPFのバインディングは、ソースを見つけるために、ビジュアルツリーを使用しているためそれがあると思います。この場合、MyComboBoxColumnはビジュアルツリーにないため、その名前の要素を見つけることができません。

私はまた、RelativeSourceを使って要素を見つけようとしましたが、どちらもうまくいかず、同じ理由が考えられます。

私は仕事に得ることができる唯一のことは、コンストラクタ内の列自体にボタンのDataContextを設定することです:

public MyComboBoxColumn() 
{ 
    InitializeComponent(); 

    this.TestButton.DataContext = this; 
} 

そして、XAMLでバインドを変更:

<tk:DataGridTemplateColumn.Header> 
    <Button Content="{Binding Path=MyHeader}" x:Name="TestButton" /> 
</tk:DataGridTemplateColumn.Header> 

これは最善の方法ではないようですが、少なくとも動作します。

+0

はい、解決策はあります。ありがとうございます! – alex2k8

0

コンストラクタ内にDataContextを設定したくない場合や設定できない場合(たとえば、コード内で列を動的に作成する場合)は、バインドするオブジェクト(データコンテキスト)に列のHeaderプロパティを設定します。そしてHeaderStyleデータテンプレートでこのオブジェクトにバインドすることができます。

詳細はthis questionを参照してください。

関連する問題