2012-09-13 104 views
1

所以我有類似下面的一些代碼:(請原諒我試圖在SO編輯一職,以簡化任何typos--)的DataContext在Style.Trigger沒有約束力

<my:CustomContentControl> 
     <my:CustomContentControl.Style> 
      <Style TargetType="{x:Type my:CustomContentControl}"> 
       <Style.Triggers>       
        <DataTrigger Binding="{Binding Path=CurrentView}" Value="MyCustomView"> 
         <Setter Property="Content"> 
          <Setter.Value> 
           <my:CustomView DataContext="{Binding DataContextForMyCustomView"/> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </m:CustomContentControl.Style> 
</my:CustomContentControl> 

的問題是,每當出現DataTrigger,設置者確實設置Content屬性爲my:CustomView,但它不是不是綁定DataContext。如果我在觸發器之外移動相同的代碼,DataContext綁定工作得很好。

任何想法?如果這是某種限制,是否有任何解決方法?

更新:

我收到在輸出窗口中出現以下錯誤:

System.Windows.Data Error: 3 : Cannot find element that provides DataContext. BindingExpression:Path=DataContextForMyCustomView; DataItem=null; target element is 'CustomView' (Name='customView'); target property is 'DataContext' (type 'Object')

+0

在輸出窗口中是否有關於此綁定的錯誤或警告消息? –

+0

@Miklós:很好的建議,謝謝。呃,它讓我忘記了輸出窗口中出現綁定錯誤!更新我的問題瓦特/錯誤現在... – HolySamosa

+0

@HolySamosa你的UserControl是什麼?你發佈的錯誤使得它聽起來像它沒有'DataContext'的對象,比如'DataGridColumn.Header'。此外,如果多個對象應用了該樣式,您應該使用'ContentTemplate'而不是'Content'來避免異常。 – Rachel

回答

2

您發佈的錯誤會使得它聽起來像你的自定義控制是一個對象,它不有一個DataContext,如DataGridColumn.Header

要解決這個問題,你可以在你.Resources創建Freezeable對象包含你正在尋找的綁定,然後綁定你的my:CustomView.DataContext到該對象

<my:CustomContentControl.Resources> 
    <local:BindingProxy x:Key="proxy" 
     Data="{Binding DataContextForMyCustomView, ElementName=MyControl}" /> 
</my:CustomContentControl.Resources> 

... 

<my:CustomView DataContext="{Binding Source={StaticResource proxy}}"/> 

下面是複製的樣本Freezable對象的代碼從here

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. 
    // This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), 
      typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

而且,你真的應該使用ContentTemplate而不是Content以避免EXCE如果不止一個對象適用該風格:)