在UserControl中绑定到DataGrid的ItemSource

时间:2016-02-14 23:06:21

标签: c# .net wpf xaml mvvm

在我的应用程序中,我必须在一个屏幕上显示具有相同结构的多个网格控件(我使用DevExpress),因此我决定为这些网格创建UserControl。

<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>

我希望能够在我的Window的xaml中为此GridControl设置ItemSource。我知道我必须使用DataContext属性来执行此操作,但我不知道如何正确使用它。那么,解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分: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。

下一步是让DataGrid中的UserControl使用您为该属性分配的任何内容。不确定您的命名空间是什么,根据需要进行编辑。我只在这里列出相关部分:

<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>        

这假设您的Window DataContext是一个具有相关Items1Items2属性的对象。