2013-02-07 22 views
0

我創建了一個自定義控件,該控件在其自己的XAML工作表中進行了樣式化和配置。該控件中的數據綁定使用特定的對象(CProject類)。如何將自定義對象作爲datacontext實例獲取或設置爲wpf中的自定義控件

爲了澄清,控件是一個項目框架,它具有設置控件和一個畫布,它將成爲每個/任何項目的工作區。

項目控制(IPProjectPanel)繼承了「Frame」,並且還將一個「settings」堆棧面板添加到其子項列表中,該子項列表又包含 - well設置的控件。

但是,CProject類是純粹的功能部件,沒有UI交互或處理任何事情。因此,我需要將CProject的一個實例「插入」每個可以激活的獨特項目。因此,我想將一個特定的CProject實例設置爲datacontext到TabPanel中的每個IPProjectPanel實例。我想通過代碼設置datacontext,或者通過XAML中的設置datacontext創建它,並在初始化後檢索它。

雖然問題是,我無法完全弄清楚。

這裏是IPProjectPanel在XAML的風格的一個片段,使用該方法來設置的datacontext在XAML:

<Style TargetType="{x:Type ip:IPProjectGrid}"> 
    <Setter Property="OverridesDefaultStyle" 
     Value="True" /> 
    <Setter Property="SnapsToDevicePixels" 
     Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ip:IPProjectGrid}"> 
       <Grid Background="White" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" 
         Margin="0"> 
        <!----> 
        <Grid.DataContext> 
         <ipp:CProject></ipp:CProject> 
        </Grid.DataContext> 

        <StackPanel x:Name="PART_settingsPanel" 
           HorizontalAlignment="Right" 
           VerticalAlignment="Stretch" 
           MinWidth="300" Background="Gray"> 

         <GroupBox Header="Project settings"> 
          <StackPanel> 

    .... 

    </style> 

這被設置爲背景網格,但我想將其作爲實際類的上下文(IPProjectPanel)。

因此,IPProjectPanel實例是由代碼(現在..)創建的,我需要檢索CProject實例(或設置一個),以便我可以使用它。

我想繼續以C#/ WPF的方式來做東西,因爲這個應用程序也是WPF和C#概念等的培訓。因此,「最好的C#-WPF」方法是非常受歡迎的,但這是一種解決方案!

謝謝你的時間。

回答

0

你有這樣的設置目前的方式有可能創造一些討厭的潛力錯誤。您不應該在模板中聲明DataContext對象實例,除非您不打算在該模板範圍之外訪問它。通過這樣做,您可以在任何時候需要可視地重新加載控件(如更改選項卡)時創建CProject類的新實例,並且您最終可以在代碼中引用舊的CProject實例,同時在代碼中顯示完全獨立的實例屏幕。聲明不在模板中的DataContext對象(即Window.DataContext)很好。

如果您希望每個控件實例都創建它自己的CProject實例,那麼最好在構造函數的代碼中進行該操作,並將其作爲控件的屬性,然後您可以將Grid.DataContext綁定到模板內部。避免將其設置爲控制自身的DataContext財產,因爲這將導致實際是在爲它在XAML宣佈通過重寫繼承DataContext打破控制設置的任何隱源綁定:

Grid.DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PropertyWithCProject}" 

它可能更容易您需要從外部控制CProject實例並將它們交給控制實例。爲此,您可以在容器ViewModel類(MVVM模式)中創建它們,並將其設置爲DataContext以包含所有自定義控件。然後,您可以公開單獨的CProjects或它們的集合,並將您的控件的DataContexts綁定到這些。

1

所以一般來說,datacontext主要是針對你的ViewModel的,事實上WPF是爲MVVM(Model View ViewModel)風格的應用程序設置的。這實際上很簡單,但如果你正在尋找「最佳C#-WPF」的做法,花時間學習MVVM。這真的很簡單。

從CodeProject

簡單的例子:

http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

從微軟(有點重讀):

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

+0

謝謝!我沒有意識到這個概念,但我很高興現在我發現了它,處於開發的早期階段! ;) –

相關問題