绑定到ObservableCollection特定索引

时间:2012-12-22 18:07:02

标签: wpf mvvm binding

我有下一堂课:

public class GridViewControlModel : NotificationObject
{
    DataTable datasource;
        public DataTable Datasource
        {
            get
            {
                return datasource;
            }
            set
            {
                datasource = value;
                RaisePropertyChanged("Datasource");
            }
        }

        ObservableCollection<string> fieldsNames;
        public ObservableCollection<string> FieldsNames
        {
            get
            {
                if (fieldsNames == null)
                {
                    fieldsNames = new ObservableCollection<string>();
                }
                return fieldsNames;
            }
            set
            {
                fieldsNames = value;
                RaisePropertyChanged("FieldsNames");
            }
        }    
//and more properties
}

属性“FieldsNames”包含我希望绑定到GridView数据列标题的列标题列。

在我的ViewModel中我创建了属性 - GridViewControlModel CurrentGridViewData,我想将我的GridView列标题绑定到我的CurrentGridViewData.FieldsNames [索引]

例如

<dxg:GridColumn1 Header="{Binding CurrentGridViewData, Path=CurrentGridViewData.FieldsNames[0]}">
<dxg:GridColumn2 Header="{Binding CurrentGridViewData, Path=CurrentGridViewData.FieldsNames[1]}">

依旧...... 我正在使用DevExpress gridCointrol,但我不认为它的问题。

如何将属性绑定到特定的ObservableCollection索引?

我会解释我想做什么。 我有很多视图的GridControl。 当用户切换视图时,网格控件需要更改其整个结构(不同的列数,列标题,列大小,类型等)。我创建了一个包含每个视图的所有属性和设置的类(我的问题中的这个CurrentGridViewData类),当用户切换视图时,我将CurrentGridViewData的引用更改为右视图实例,并通过绑定我想要进行所有网格更改。 还有更好的方法吗?

由于

由于


我想我找到了与DevExpress GridControl相关的可能解决方案。 看下一个链接 http://documentation.devexpress.com/#wpf/CustomDocument10121

你在想什么?它比使用DataTemplate更好吗?

由于

1 个答案:

答案 0 :(得分:1)

我的解决方案是为要绑定到DataGrid的每个模型创建一个DataTemplate。

例如,假设您有3个不同的DataTables:OrdersDataTable,CustomersDataTable和ProductsDataTable。

首先要用简单的ContentControl替换你的DataGrid控件。

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

然后在您的应用程序资源中添加并创建这些DataTemplate。

<DataTemplate DataType="{x:Type local:OrdersDataTable}">
    <DataGrid ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ID}" Header="ID"/>
            <DataGridTextColumn Binding="{Binding Tax}" Header="Tax"/>
            <DataGridTextColumn Binding="{Binding NetAmount}" Header="NetAmount"/>
        </DataGrid.Columns>
    </DataGrid>
</DataTemplate>

<DataTemplate DataType="{x:Type local:CustomersDataTable}">
    <DataGrid ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ID}" Header="ID"/>
            <DataGridTextColumn Binding="{Binding FirstName}" Header="First name"/>
            <DataGridTextColumn Binding="{Binding LastName}" Header="Last name"/>
        </DataGrid.Columns>
    </DataGrid>
</DataTemplate>

<DataTemplate DataType="{x:Type local:ProductsDataTable}">
    <DataGrid ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ID}" Header="ID"/>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
            <DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity"/>
            <DataGridTextColumn Binding="{Binding UnitPrice}" Header="UnitPrice"/>
        </DataGrid.Columns>
    </DataGrid>
</DataTemplate>

这样,当您将DataTable绑定到内容控件时,它将查找具体的DataTable类型并抓取应用程序资源以查找相应的DataTemplate以显示您的DataTable。

我建议使用Style作为DataGrid控件,这样就不必在所有DataTemplate中重现样式。

注意:DataGrid.ItemsSource可能不适合你,只是适应它。