2017-09-01 32 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