2016-02-14 97 views
0

在我的應用程序中,我必須在一個屏幕上顯示具有相同結構的多個網格控件(我使用DevExpress),因此我決定爲這些網格創建UserControl。在UserControl中綁定到DataGrid的ItemSource

<UserControl x:Class="MyApp.GridUserControl" 
     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" 
     xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"> 
<Border BorderBrush="Black" BorderThickness="1"> 
    <Grid> 
     <dxg:GridControl SelectionMode="Row" 
         AutoGenerateColumns="None"> 

      <dxg:GridControl.Columns> 
       <dxg:GridColumn Header="{x:Static res:Resources.Time}" Binding="{Binding LessonTime}"/> 
       <dxg:GridColumn Header="{x:Static res:Resources.Lesson}" Binding="{Binding LessonName}"/> 
       <dxg:GridColumn Header="{x:Static res:Resources.Classroom}" Binding="{Binding Classroom}"/> 
      </dxg:GridControl.Columns> 
      <dxg:GridControl.View> 
       <dxg:TableView AllowEditing="False" AutoWidth="True" ShowGroupPanel="False"> 
       </dxg:TableView> 
      </dxg:GridControl.View> 
     </dxg:GridControl> 
    </Grid> 
</Border> 

我希望能夠設置的ItemSource此GridControl在我窗口的XAML。我知道我必須使用DataContext屬性來執行此操作,但我不知道如何正確使用它。那麼,解決這個問題的最好方法是什麼?

+0

你的意思是說你的'UserControl'將被用在一個Window上,並且你不想在你發佈的這個XAML中設置'ItemsSource',而是在Window的XAML中? – vesan

+0

是的,這就是我想要實現的。我的問題是,我必須在我的窗口中使用幾個UserControls,所有與ItemSource不同的集合。 – floyd

+0

當然,我可以在不使用UserControl的情況下在我的窗口中創建所有GridControls,但由於大量的可重複代碼,它不是最佳解決方案。 – floyd

回答

1

好吧,首先,您必須將一個屬性添加到您的UserControl,然後將其用作數據網格的ItemsSource。這應該是這樣的:

public partial class GridUserControl : UserControl 
{ 
    public object ItemsSource 
    { 
     get { return (object)GetValue(ItemsSourceProperty); } 
     set { SetValue(ItemsSourceProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsSourceProperty = 
     DependencyProperty.Register("ItemsSource", typeof(object), typeof(GridUserControl), new PropertyMetadata(null)); 

    //constructor etc. 
} 

另一種選擇是立足於ItemsControl,不UserControl你的控制 - 然後你從基類的ItemsControl屬性。其餘的會有所不同,但是,現在我將專注於UserControl。

下一步是讓UserControl中的DataGrid使用您分配給該屬性的任何內容。不確定你的名字空間是什麼,根據需要進行編輯。我在這裏只列出了相關部分:

<UserControl x:Class="MyApp.GridUserControl" 
      xmlns:local="clr-namespace:MyApp"> 
    <dxg:GridControl ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=local:GridUserControl}}" /> 

</UserControl> 

然後,你的窗口,你可以使用它像這樣(再次,有關部分只):

<Window x:Class="MyApp.Window1" 
     xmlns:local="clr-namespace:MyApp"> 
    <Grid> 
     <local:GridUserControl ItemsSource="{Binding Items1}"></local:GridUserControl> 
     <local:GridUserControl ItemsSource="{Binding Items2}"></local:GridUserControl> 
    </Grid> 
</Window>   

這裏假設你的窗口的DataContext是具有相關Items1Items2屬性的對象。

相關問題