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]}">

など...DevExpressgridCointrolを使用していますが、問題はないと思います。

プロパティを特定のObservableCollectionインデックスにバインドするにはどうすればよいですか?

私がやろうとしていることを説明します。私は多くのビューを持つGridControlを持っています。ユーザーがビューを切り替えるとき、グリッドコントロールはその構造全体を変更する必要があります(列の数、列ヘッダー、列サイズ、タイプなどが異なります)。各ビューのすべてのプロパティと設定を含むクラス(私の質問からのこのCurrentGridViewDataクラス)を作成し、ユーザーがビューを切り替えるときに、CurrentGridViewDataの参照を正しいビューインスタンスに変更し、バインドによってすべてのグリッドを変更します。もっと良い方法はありますか?

ありがとう

ありがとう


DevExpressGridControlに関連する可能な解決策を見つけたと思います。次のリンクを見てください http://documentation.devexpress.com/#wpf/CustomDocument10121

何を考えてるの?DataTemplateを使用するよりも優れたアプローチですか?

ありがとう

4

1 に答える 1

1

私の解決策は、DataGridにバインドするモデルごとにDataTemplateを作成することです。

たとえば、OrdersDataTable、CustomersDataTable、ProductsDataTableの3つの異なるDataTableがあるとします。

まず、DataGridコントロールを単純なContentControlに置き換えます。

<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が表示されます。

すべてのDataTemplateでスタイルを再現する必要がないように、DataGridコントロールにスタイルを使用することをお勧めします。

注意:DataGrid.ItemsSourceはあなたにとって正しくないかもしれません、ただそれを適応させてください。

于 2012-12-22T19:48:21.270 に答える