2011-06-30 20 views
3

私はMVVMとデータバインディングが新しく、グリッドビューをデータテーブルに動的にバインドする際にいくつか問題があります。私はバインドする列ヘッダーを取得できますが、データはグリッド自体に表示されていません。MVVMグリッドビューとdatatable WPFのバインド

私のモデルは、渡されたSQL文字列の結果として単にデータテーブルを返します。 私のビューモデルは、単にデータテーブルをラップし、ビューにバインドされます。

今はメインウィンドウからグリッドビューを入力してデータを表示しようとしていますが、ヘッダーのみが表示されています。

私はモデルにデータがあることを知っています。

私のviewmodel:メインウィンドウからのGridViewを移入する

public class ResultsViewModel 
{ 
    private DataTable _dt; 

    public ResultsViewModel() 
    { 
     DataSource _ds = new DataSource(); 

     _dt = _ds.Execute("select * from tbl_users"); 
    } 

    public DataTable Results 
    { 
     get { return _dt; } 
     set { _dt = value; } 
    } 
} 

マイコード:

public MainWindow() 
    { 
     InitializeComponent(); 

     ResultsView view = new ResultsView(); 
     ResultsViewModel model = new ResultsViewModel(); 

     GridView Grid = new GridView(); 

     foreach (DataColumn col in model.Results.Columns) 
     { 
      Grid.Columns.Add(new GridViewColumn 
      { 
       Header = col.ColumnName, 
       DisplayMemberBinding = new Binding(col.ColumnName) 
      }); 
     } 

     view._listView.View = Grid; 
     view.DataContext = model; 

     view.SetBinding(ListView.ItemsSourceProperty, new Binding()); 

     _placeholder.Content = view; 
    } 

ResultsViewのXAML:

<UserControl x:Class="InDevReporting.Views.ResultsView" 
     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" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <ListView x:Name="_listView" /> 
</Grid> 

答えて

2

は、あなたのデータを設定してみてください文脈はmodel.Resultsです。一般的に、あなたのビューモデルに依存関係プロパティを作成し、XAMLでバインディングを指定します

view.DataContext = model.Results; 

:これまで

すなわち、この行を変更します。グリッドは、列が描画するかを把握するのに十分賢いする必要があります:コードは正確に適切ではありませんので、もし謝罪

<ListView ItemsSource="{Binding Results}" /> 

public MainWindow() 
{ 
    InitializeComponent(); 

    // your code to instance and populate model 

    this.DataContext = model; 
} 

public class ResultsViewModel : DependencyObject 
{ 
    public static readonly DependencyProperty ResultsProperty = DependencyProperty.Register("Results", typeof(DataTable) , typeof(ResultsViewModel)); 
    public DataTable Results 
    { 
     get { (DataTable)GetValue(ResultsProperty); } 
     set { SetValue(ResultsProperty, value); } 
    } 
} 

私は、メモリからこれをタップアウトしました。新しい依存関係プロパティを宣言する最も簡単な方法は、コードスニペットpropdpを使用することです。それは暗記する文法がたくさんあります。

+0

ああ、それは意味がある...助けてくれてありがとう! – ChandlerPelhams

+0

@ChandlerPelhams、喜んで助けてください。 :) –

関連する問題