2013-02-14 53 views
0

获得一个指向我有一个XAML代码片段看起来像这样:WPF从一个模板对象

<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的公共attrribute):

<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 2.初始化MyObject.GridView使用其他的DataTemplate创建为MyObject(注:GridView的是一个GUI对象)

任何输入上此?

谢谢。

+0

'任何关于此输入'是:不要从代码操纵WPF UI元素。如果他们在模板内,则更少。你想要什么? – 2013-02-14 17:43:46

回答

0

我不是100%确定你在代码中做了什么,但是我会尽我所能为此做出最好的拍摄。

首先,DataTemplates只存在告诉WPF如何绘制一个对象。它们不是一个真正的UI对象,它们会自行渲染。

DataTemplates有两种类型:Implicit和Explicit。

隐式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}" /> 

东西现在我怀疑你想要做的是通过传递GridViewUserControl.ResourcesMyObject类的GridView财产使用您的DataTemplate自定义GridView对象。

如果是这样的话,你会想在<UserControl.Resources>创建您GridView UI对象,并使用{Static Resource }MyObject定义绑定它传递给你的对象。

你还需要进行切换,你如何从GridView显示在您的DataTemplateGridViewContentControl,你可能会想在一个单亲控制来包装你都和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}" /> 
+0

谢谢瑞秋。这正是我正在寻找的。不幸的是,因为我已经被人这么多,我甚至不有“特权”,以给予好评downvoted遗忘,我不能给予好评你。 :) – user1836155 2013-02-14 22:32:16

+0

@ user1836155这很好,很高兴我能帮助:) – Rachel 2013-02-15 12:51:14

+0

顺便说,出于好奇:为什么在GridView中不为MyObject必须显式声明为代码的依赖对象的工作? – user1836155 2013-02-15 17:27:58