WPF从模板对象获取指针

时间:2013-02-14 17:30:15

标签: c# wpf xaml templates

我有一个XAML代码段,如下所示:

<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
    <Grid>
        /// Stuff

    </Grid>
    <GridView x:Name="MyGrid" />
</DataTemplate>
</UserControl.Resources>

<ns:MyObject x:Name="MyLovelyObject" />

现在,我想要一个指向“MyGrid”的指针。但是,由于WPF的内在设计,不可能在代码级别轻松访问“MyGrid”。所以,我正在寻找替代方案。以下是我想要做的但是不能完全解决语法问题(注意:GridView是MyObject的公共属性):

<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
    <Grid>
        /// Stuff

    </Grid>
    <GridView Binding="{Path=GridView}" />

</DataTemplate>
<GridView x:Key="GridViewTemplate">
    /// Lots of stuff
</GridView>
</UserControl.Resources>

<ns:MyObject x:Name="MyLovelyObject" GridView="{Binding GridViewTemplate}" />

无论如何,这显然无法解决。基本上看起来我对XAML有两个目标: 1.使用DataTemplate创建MyObject 2.使用另一个DataTemplate初始化MyObject.GridView(注意:GridView是一个GUI对象)

关于此的任何输入?

感谢。

1 个答案:

答案 0 :(得分:0)

我不是百分百肯定你在代码中做了什么,但我会尽我所能。

首先,DataTemplates仅用于告诉WPF如何绘制对象。它们不是将自己呈现的实际UI对象。

DataTemplates有两种类型:隐式和显式。

隐式DataTemplates没有x:Key字段,并且在WPF用于呈现指定DataType的对象时自动使用。

例如,您的第一个代码块中有<DataTemplate DataType="{x:Type ns:MyObject}">,因此WPF将在需要呈现ns:MyObject类型的对象时随时使用此模板

显式DataTemplates为它们定义了x:Key,并且必须在要使用它们的XAML中明确定义。例如,如果您有<DataTemplate x:Key="CustomNsObjectTemplate">,则可以将其应用于您的对象,例如<ns:MyObject Template="{StaticResource CustomNsObjectTemplate}" />

其次,如果GridView对象是UI对象,则应使用ContentControl来显示它,而不是尝试使用其他GridView。像

这样的东西
<ContentControl Content="{Binding GridView}" />

现在我怀疑你要做的是通过将GridView中的GridView传递到UserControl.Resources属性,在DataTemplate中使用自定义GridView对象你MyObject班的。

如果是这种情况,您需要在GridView中创建<UserControl.Resources> UI对象,并使用{Static Resource } MyObject绑定将其传递给您的对象}定义。

您还需要切换GridViewDataTemplateGridViewContentControl的显示方式,您可能希望将两者都包含在内您的GridGridView位于单个父级控件中,例如StackPanel,否则您将获得例外。

所以你的结束代码可能如下所示:

<UserControl.Resources>
    <DataTemplate DataType="{x:Type ns:MyObject}">
        <StackPanel>
            <Grid>
                /// Stuff
            </Grid>
            <ContentControl Content="{Binding Path=GridView}" />
        </StackPanel>
    </DataTemplate>

    <GridView x:Key="MyCustomGridView">
        /// Lots of stuff
    </GridView>
</UserControl.Resources>

<ns:MyObject GridView="{StaticResource MyCustomGridView}" />