0

我有下一节课:

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[indexes]

例如

<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 更好吗?

谢谢

4

1 回答 1

1

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

例如,假设您有 3 个不同的数据表: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。

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

注意: DataGrid.ItemsSource 可能不适合您,只需调整它即可。

于 2012-12-22T19:48:21.270 回答