2017-09-01 31 views
0

我有一個用戶控件,它使用數據觸發器來確定爲集合中的每個選項卡項目顯示哪種類型的選項卡內容。傳遞給WPF資源控件的屬性在資源主機的數據上下文中評估

選項卡內容來自用戶控件,並且它們具有自己的依賴項屬性來控制其內容。

傳遞到這些依賴項屬性的值應該綁定到集合中相應選項卡項的屬性。

這裏是我的結構有所下調,並簡化代碼:

<UserControl x:Class="MyApp.TabArea" 
    ... 
> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"> 
     <TabControl ItemsSource="{Binding Tabs}"> 
      <TabControl.Resources> 
       <local:SomeDetail x:Key="SomeDetailControl" x:Shared="False" Prop="{Binding PropValue}" PropTwo="{Binding PropTwoValue}" /> 
      </TabControl.Resources> 
      <TabControl.ItemTemplate> 
       ... 
      </TabControl.ItemTemplate> 

      <TabControl.ItemContainerStyle> 
       <Style TargetType="TabItem"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding MyBinding}" Value="True"> 
          <Setter Property="Content" Value="{StaticResource SomeDetailControl}" /> 
         </DataTrigger> 
         ... 
        </Style.Triggers> 
       </Style> 
      </TabControl.ItemContainerStyle> 
     </TabControl> 
    </Grid> 
</UserControl> 

我已經放在了詳細的用戶控制在資源選項卡控件,將其標記爲不共享,並增加了一些綁定。

這是我的理解,這些綁定進行了評估時,控制使用,在這種情況下。但是,我收到了一個綁定錯誤,在用戶控件上找不到PropValue等。

最初我想知道Grid的數據上下文是否拋棄了這種情況,但刪除它只是將錯誤移出到包含組件。

我也試過移動資源到網格和風格本身無濟於事。

如何確保資源附加屬性的綁定來自標籤項目對象?

回答

0

我有一個用戶控件,它使用數據觸發器來確定爲集合中的每個選項卡項顯示哪種類型的選項卡內容。

您應該使用ContentTemplateSelector來選擇合適的DataTemplatehttps://jacobaloysious.wordpress.com/2013/08/19/mvvm-using-contenttemplateselector-in-tab-control-view/

或者你可以嘗試使用ContentTemplate

<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"> 
    <TabControl ItemsSource="{Binding Tabs}"> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DataTemplate.Resources> 
        <local:SomeDetail x:Key="SomeDetailControl" x:Shared="False" Prop="{Binding PropValue}" PropTwo="{Binding PropTwoValue}" /> 
       </DataTemplate.Resources> 
       <ContentControl> 
        <ContentControl.Style> 
         <Style TargetType="ContentControl"> 
          <Setter Property="Content"> 
           <Setter.Value> 
            <TextBlock>default template...</TextBlock> 
           </Setter.Value> 
          </Setter> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding MyBinding}" Value="True"> 
            <Setter Property="Content" Value="{StaticResource SomeDetailControl}" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </ContentControl.Style> 
       </ContentControl> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 
+0

的'ContentTemplate'方法似乎更好,但我跑我想我已經解決了將事物作爲非共享資源移動的問題:現在控件似乎在選項卡之間「共享」。例如,修改後的一個選項卡中的文本框也將在另一個選項卡中使用相同的控件進行修改。 – Dan

+0

這就是爲什麼您應該定義兩個DataTemplates並使用ContentTemplateSelector根據MyBinding屬性的值選擇合適的一個。 – mm8

+0

或將TextBox綁定到源屬性。 – mm8