2014-05-19 49 views
0

這可能是個愚蠢的問題,但我無法弄清楚如何做到這一點。我有一個名爲「ReportUserControl」的UserControl,裏面有一個名爲「ReportGrid」的網格。我想從ReportUserControl子項中刪除ReportGrid。我試過這個:如何從UserControl中刪除子項?

ReportUserControl control = new ReportUserControl(); 
control.Children.Remove(...); 

問題是UserControl沒有.Children.Remove()選項。我如何管理這個?

UPDATE

我要「送」這個網到另一個類,並使用它。問題是,當我發送網格並嘗試在另一個類中使用它時,我得到這一點:「指定的元素已經是另一個元素的邏輯子元素,請先斷開它。」所以我必須從我的UserControl中刪除它,但不知道如何。

ReportUserControl XAML:

<UserControl x:Class="WPFReportTest.ReportUserControl " 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     Height="29.7cm" Width="21cm"> 

    <Grid Name="ReportGrid"> 
      ****GridContent*** 
    </Grid> 

</UserControl> 

ReportClass:

public class ReportingClass 
{ 
    Grid reportGrid; 
    public ReportingClass(Grid tempGrid) 
    { 
     reportGrid = tempGrid; 
    } 

    public Page SetPageContent() 
    { 
     Page page = new Page(); 
     page.Content = reportGrid; 
    }  

} 

InstanceWindow

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     ReportUserControl userControl = new ReportUserControl(); 
     ReportingClass report = new ReportingClass(userControl.ReportGrid); 
    } 
} 

這是不是完整的代碼只是小部分知道我想要管理的東西。 Line「page.Content = reportGrid;」是發生異常的地方。

+0

ReportUserControl繼承自什麼? –

+0

ReportUserControl:UserControl – Stojdza

+0

你爲什麼要這麼做?您應該使用正確的DataBinding。 –

回答

0

UserControlContent財產(msdn)。

如果你想刪除的內容設置爲空:

ReportUserControl control = new ReportUserControl(); 
control.Content = null; 

例子:

public class ReportingClass 
{ 
    ReportUserControl _reportUserControl; 
    Grid reportGrid; 
    public ReportingClass(ReportUserControl reportUserControl, Grid tempGrid) 
    { 
     _reportUserControl = reportUserControl; 
     reportGrid = tempGrid; 
    } 

    public Page SetPageContent() 
    { 
     Page page = new Page(); 
     // _reportUserControl is the instance of object ReportUserControl where content is reportGrid 
     _reportUserControl.Content = null; 
     page.Content = reportGrid; 
     return page; 
    } 
} 

編輯:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     ReportUserControl userControl = new ReportUserControl(); 
     ReportingClass report = new ReportingClass(userControl, userControl.Content as Grid);  
    } 
} 
+0

仍然得到同樣惱人的錯誤。 – Stojdza

+0

@Stojdza再次檢查我的答案:) – kmatyaszek

0

@Stojdza,WPF中,我們一般不要」以這種方式操作UI元素。我們操縱數據元素並聲明DataTemplate來定義數據的外觀。所以在你的情況下,你不應該字面上移動Grid ...只是移動數據,並讓WPF使用相同的DataTemplate重新創建您的Grid任何地方。它看起來是一樣的,但它更容易一些,你可以節省所有這些麻煩。

因此,如果您有興趣以這種簡單的方式進行操作,請首先創建一個具有UserControl中所需屬性的類,我們將其稱爲Data。現在Application.Resources聲明DataTemplate,這樣就可以使用它的應用範圍:

<DataTemplate DataType="{x:Type YourNamespacePrefix:Data}"> 
    <!-- Define your Grid here --> 
<DataTemplate> 

現在,只要你想顯示你的Grid,無論是在收集,或單獨,你只需要Data類型的屬性綁定(或它們的集合),以某種形式的ContentControl

public Data Data { get; set; } 

...

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

因此,不是試圖複製Grid,而是將數據複製到Data類型的另一個屬性,然後用上面的單行重新創建Grid。有關DataTemplate s的更多信息,請參見MSDN上的Data Templating Overview頁面。