传递给WPF资源控件的属性在资源主机

时间:2017-09-01 10:01:37

标签: c# 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 数据上下文是否正在抛弃它,但是删除它只是将错误移出到包含组件。

我还尝试将资源移动到网格并且样式本身无济于事。

如何确保资源附加属性的绑定来自标签项对象?

1 个答案:

答案 0 :(得分: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>