2013-02-14 49 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