2011-03-24 54 views
0

私は自分のViewModel上のDataSetにDataGridをバインドしています。WPFリストビューGridViewバインディング:動的列

ListView.GridViewなどの軽量コントロールに切り替えたいが、動的列生成をサポートしていないようだ。

これはMVVMモデルなので、私は自分のデータセットの列をループすることを避け、コードビハインドから各GridViewColumnを追加しようとしています。

1. ListViewを明示的に列を設定するDataSetにバインドするか、または2. ColumnsコレクションをViewModelのプロパティにバインドします。

そうでない場合は、これを可能にし、DataGridより優れたグリッドコントロールがありますか?

+0

ので、DataSetが強く型付けされていませんか?それは動的ですか? –

+0

は正しいです。 –

答えて

0

私は個人的にIValueConverterインターフェイスを使用して、内部で列を管理できるオブジェクトにデータセットを変換します。

public sealed class DataSetConverter : IValueConverter 
    { 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if((DataSet)value != null) 
{ 

// Put logic in here to loop through the columns and create an object to bind to the ListView control. 

} 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 

XAMLコード

<conv:DataSetConverter x:key="datasetConverter"/> 
       <ListBox x:Name="listbox1" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
         ItemsSource="{Binding datasetObject, Converter={StaticResource datasetConverter}}" > 
+0

を厳密にタイプしないと、DataGridが透過的にGridviewを実行しない理由は分かりますか? –

+0

Gridviewはそれをします、あなたがAutoGenerateColumns = trueのスイッチを入れたことを確かめてください。 –

+0

はい、それを試しました。 DataGridが列を生成するためには、同じプロパティが必要です。 GridViewはそれをしません –

-2

DATASET1を想定します。

Customer 
    Name 
    Address 
    Phone 

モデル:

namespace WpfApplication1.Model 
{ 
    class MyDataSetModel 
    { 
     private DataSet1 _myDataSet; 
     private DataSet1TableAdapters.CustomerTableAdapter _myCustomerTableAdapter; 
     public DataSet1.CustomerDataTable Customers 
     { 
      get { return _myDataSet.Customer; } 
     } 

     public void FetchCustomers() 
     { 
      _myDataSet = new DataSet1(); 
      _myCustomerTableAdapter = new CustomerTableAdapter(); 
      _myCustomerTableAdapter.Fill(_myDataSet.Customer); 
     } 
    } 
} 

のViewModel:(clairityのためにここで見ると組み合わせる)

public partial class Window1 : Window 
{ 
    private MyDataSetModel _myDataModel; 
    public Window1() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(Window1_Loaded); 
    } 

    void Window1_Loaded(object sender, RoutedEventArgs e) 
    { 
     _myDataModel = new MyDataSetModel(); 
     _myDataModel.FetchCustomers(); 

     listView1.ItemsSource = _myDataModel.Customers; 
    } 
} 

ビュー:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="400" Width="600"> 
    <Grid> 
     <ListView Name="listView1"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding= "{Binding Path=Name}"> 
         <GridViewColumnHeader Width="100">Name</GridViewColumnHeader> 
        </GridViewColumn> 

        <GridViewColumn DisplayMemberBinding= "{Binding Path=Address}"> 
         <GridViewColumnHeader Width="340">Address</GridViewColumnHeader> 
        </GridViewColumn> 

        <GridViewColumn DisplayMemberBinding= "{Binding Path=Phone}"> 
         <GridViewColumnHeader Width="100">Phone</GridViewColumnHeader> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</Window> 
+0

彼は動的列の生成について尋ねられますが、故意に列の集合については問いません。あなたは一般的なユースケースを説明しました。次回は質問をよく読んでください。 –

関連する問題