2010-12-15 27 views
0

テンプレートを適用するカスタムコントロールがあります。カスタムコントロール内では、スタイル内のテンプレートコントロールにバインドされたプロパティを定義しました。私がLoadedイベントを購読していて、プロパティを取得しようとすると、それらはnullです。しかし、OnPropertyChangedをオーバーレイしている場合は、値があります。誰かが理由を説明してくれますか? ColumnEntityプロパティを見てください。スタイルを使用するときにプロパティ値を取得できません

ありがとうございます。

は私が

public override void OnApplyTemplate()

答えて

0

がロードされたイベントの代わりにOnApplyTemplateイベントを使用してみてくださいbriefetyのためのいくつかの部分を削除しましたビジュアルツリー全体の後のロード処理が構築されている。値を収集するために単一のイベントに頼るのではなく、DependencyPropertiesでPropertyChangedハンドラを使用するだけで済みます。これは、すでに確認済みで、期待値を与えています。

使用するColumnEntityを簡略化することもできますColumnEntity="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Column}"

0

バインディング評価はで後で起こる

​​

public class DataGridColumnFilter : Control 
{ 
    static DataGridColumnFilter() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(
      typeof(DataGridColumnFilter), new FrameworkPropertyMetadata(typeof(DataGridColumnFilter))); 
    } 

    public DataGridColumnFilter() 
    { 
     this.Loaded += new RoutedEventHandler(DataGridColumnFilter_Loaded); 
    } 

    void DataGridColumnFilter_Loaded(object sender, RoutedEventArgs e) 
    { 
     // here is would be null! 
     var controller = ColumnEntity; 
    } 
    // For some reason this seems to be the only place to access the ColumnEntity 
      protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     if (e.Property == ItemsSourceEntityProperty && e.OldValue != e.NewValue && null != DataGridEntity && ColumnEntity is DataGridColumn) 
     { 
      // here it works fine. The property has a proper value 
       var controller = ColumnEntity; 
     } 

     base.OnPropertyChanged(e); 
    } 

    #region Properties 

    public Query QueryEntity 
    { 
     get { return (Query)GetValue(QueryEntityProperty); } 
     set { SetValue(QueryEntityProperty, value); } 
    } 

    public static readonly DependencyProperty QueryEntityProperty = 
     DependencyProperty.Register("QueryEntity", typeof(Query), typeof(DataGridColumnFilter)); 

    public DataGridColumn ColumnEntity 
    { 
     get { return (DataGridColumn)GetValue(ColumnEntityProperty); } 
     set { SetValue(ColumnEntityProperty, value); } 
    } 

    public static readonly DependencyProperty ColumnEntityProperty = 
     DependencyProperty.Register("ColumnEntity", typeof(DataGridColumn), typeof(DataGridColumnFilter)); 

    public DataGrid DataGridEntity 
    { 
     get { return (DataGrid)GetValue(DataGridEntityProperty); } 
     set { SetValue(DataGridEntityProperty, value); } 
    } 

    public static readonly DependencyProperty DataGridEntityProperty = 
     DependencyProperty.Register("DataGridEntity", typeof(DataGrid), typeof(DataGridColumnFilter)); 

    public IEnumerable ItemsSourceEntity 
    { 
     get { return (IEnumerable)GetValue(ItemsSourceEntityProperty); } 
     set { SetValue(ItemsSourceEntityProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsSourceEntityProperty = 
     DependencyProperty.Register("ItemsSourceEntity", typeof(IEnumerable), typeof(DataGridColumnFilter)); 

    #endregion 
} 
関連する問題