0

我有一个如下所示的 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 对象)

对此有任何意见吗?

谢谢。

4

1 回答 1

0

我不是 100% 确定你在代码中做了什么,但我会尽力而为。

首先,DataTemplate 的存在只是为了告诉 WPF 如何绘制一个对象。它们不是会自行呈现的实际 UI 对象。

有两种类型的数据模板:隐式和显式。

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

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

显式数据模板已x:Key为它们定义,并且必须在要使用它们的 XAML 中显式定义。例如,如果您有<DataTemplate x:Key="CustomNsObjectTemplate">,那么您可以将它应用于您的对象,例如<ns:MyObject Template="{StaticResource CustomNsObjectTemplate}" />

其次,如果GridView对象是 UI 对象,则应使用 aContentControl来显示它,而不是尝试使用另一个GridView. 就像是

<ContentControl Content="{Binding GridView}" />

现在我怀疑你想要做的是GridView在你的 DataTemplate 中使用一个自定义对象,方法是将你的GridViewin传递给你的类UserControl.ResourcesGridView属性。MyObject

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

You'll also want to switch how you display the GridView in your DataTemplate from a GridView to a ContentControl, and you'll probably want to wrap both your Grid and GridView in a single parent control, like a StackPanel or you'll get an exception.

So your end code might look something like this:

<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}" />
于 2013-02-14T17:53:33.610 回答