2010-03-20 72 views
2
<ListView> 
    <ListView.Resources> 
     <DataTempalte x:Key="label"> 
      <TextBlock Text="{Binding Label}"/> 
     </DataTEmplate> 
     <DataTemplate x:Key="editor"> 
      <UserControl Content="{Binding Control.content}"/> <!-- This is the line --> 
     </DataTemplate> 
    </ListView.Resources> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Name" CellTemplate="{StaticResource label}"/> 
      <GridViewColumn Header="Value" CellTemplate="{StaticResource editor}"/> 
     </GridView> 
    </ListView.View> 

在銷售線,我與被動態地在代碼中創建另一用戶控件的內容替換一個用戶控件的內容。 我想要替換整個控件,而不僅僅是內容。有沒有辦法做到這一點?如何替換整個xaml元素?

編輯:

爲了澄清我的意圖,我ListView集合保存Items擁有控制(從UserControl繼承),它知道如何操作該項目的價值。簡單地綁定內容就可以獲得視覺表示,但會丟棄派生控件的其他非內容相關屬性。如果我能以更全面的方式替換我的模板中的UserControl,這將解決這個問題。

回答

2

我終於想通這一個:

<DataTemplate x:Key="editor"> 
     <ContentPresenter Content="{Binding Path=Control}"/> 
    </DataTemplate> 

ContentPresenter正是我一直在尋找。

0

看起來要在基於某種狀態的電池標籤和文本框之間進行切換。我會爲此使用觸發器。

或者看看這可能是有用的:http://www.codeproject.com/KB/WPF/editabletextblock.aspx


更新時間:

這裏是一個黑客(我不建議這一點,我恨我自己一點點的張貼):

<DataTemplate x:Key="editor"> 
     <Border Loaded="Border_Loaded"> 
      <UserControl Content="{Binding Control.content}"/> 
     </Border> 
    </DataTemplate> 

在後面的代碼:

private void Border_Loaded(object sender, RoutedEventArgs e) 
    { 
     // Example of replacement 
     Button b = new Button(); 
     b.Content = "Woot!"; 
     ((Border)sender).Child = b; 
    } 

很顯然,你需要存儲的參考邊界和跟蹤哪些邊界屬於哪個小區。我無法想象這比切換模板複雜。

+0

有趣的聯繫,但是這不是我想要的目的。我想用另一個任意的用戶控件替換該用戶控件。 – luke

+0

即時切換模板在這種情況下工作嗎?看到這裏的細節http://codingbandit.com/Blog/blog/wpf-data-templates-part-3-switching-data-templates-at-runtime/。 有一種方法可以做你想做的,但它是kludgey,我懷疑不是最好的方法,以達到預期的行爲。 –

+0

在飛行中切換模板是我原來所做的。切換UserControl簡化了我所做的工作。 – luke