2016-12-06 12 views
1

私のwpfアプリケーションでは、Prismライブラリを使用してビューモデルを私のビューにオートワイヤリングしています。私は自動的にビューとモデルをバインドする単純なプロパティのためにこれを動作させています。今、私はデータをバインドして、DataGridに結びつけようとしています。以下は現在のシナリオのための私の構造です。バインディングObservableCollection <T> ItemSource to DataGrid

ConfigurationDetails.cs

public class ConfigurationDetails:BindableBase 
{ 
    private int _id; 
    public int Id { get { return _id; } set { SetProperty(ref _id, value); } } 

    private string _configFName; 
    private string _configSName; 
    private string _configUName; 

    public string ConfigFName { get { return _configFName; } set { SetProperty(ref _configFName, value); } } 
    public string ConfigSName { get { return _configSName; } set { SetProperty(ref _configSName, value); } } 
    public string ConfigUName { get { return _configUName; } set { SetProperty(ref _configUName, value); } } 
} 

ConfigurationWindowViewModel.cs

public class ConfigurationWindowViewModel : BindableBase 
{ 
    public ConfigurationWindowViewModel() 
    { 
     ConfigDetails = new ObservableCollection<ConfigurationDetails>(); 
    } 
    private ObservableCollection<ConfigurationDetails> _configDetails; 
    public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } } 
} 

ConfigurationWindow.xaml

<UserControl x:Class="MyApp.Views.ConfigurationWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:prism="http://prismlibrary.com/" 
     prism:ViewModelLocator.AutoWireViewModel="True" 
     HorizontalContentAlignment="Center"> 
    .... 
    <DataGrid ItemsSource="{Binding ConfigDetails}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
       <DataGridTextColumn Header="F NAME" Width="*" Binding="{Binding Path=ConfigFName}"/> 
       <DataGridTextColumn Header="S NAME" Width="*" Binding="{Binding Path=ConfigSName}"/> 
       <DataGridTextColumn Header="U NAME" Width="*" Binding="{Binding Path=ConfigUName}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    .... 
</UserControl> 

ConfigurationWindow.xaml.cs

public ConfigurationWindow() 
{ 
    InitializeComponent(); 
    using (_db = new MyEntities()) 
    { 
     var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails() 
     { 
       ConfigFName = x.ConfigFName, 
       ConfigSName = x.ConfigSName, 
       ConfigUName = x.ConfigUName, 
       Id = x.ConfigID 
     }); 
     model.ConfigDetails = new ObservableCollection<ConfigurationDetails>(configRecords); 
     //model.ConfigDetails will have records assigned to it when debugged 
     } 
    } 
} 

しかし、それでもまだ、私は私のDataGridに表示されている任意のレコードを表示しません。ここには何が欠けているのですか?私はViewModelLocator.AutoWireViewModelも使用しており、他のモデルのプロパティでも完璧に動作しています。ここに助けを求めることを願っています。

更新 -ConfigurationWindowViewModel.cs私はViewModelsフォルダに配置しました。申し訳ありませんが、言及するには欠けている。

+0

はあなた 'ConfigurationWindow'は[たIView](http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/)を実装していますか? – slugster

+0

@slugster 'IView'は、' ViewModel'が私の知る限り 'Views'が存在するのと同じフォルダに置かれている場合にのみ必要です。それ以外の場合は、 'ViewModels'フォルダに置いておくと、' prism'が注意しますか? –

+0

だから、コード内のモデルはどこから来ていますか(そのビューモデルですか)? btwどうしてあなたのデータをコードの中に残しているのですか? – adminSoftDK

答えて

2

ここで、ConfigurationDetailsオブジェクトをConfigDetailsコレクションに追加していますか? ConfigurationWindowViewModelクラスのコンストラクタにいくつかの項目を追加しよう:

public class ConfigurationWindowViewModel : BindableBase 
{ 
    public ConfigurationWindowViewModel() 
    { 
    ConfigDetails = new ObservableCollection<ConfigurationDetails>(); 
    //add some items...: 
    ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" }); 
    ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" }); 
    ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" }); 
    } 
    private ObservableCollection<ConfigurationDetails> _configDetails; 
    public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } } 
} 

を、あなたのConfigurationWindowViewModelクラスつまり、デフォルトの命名規則に従う必要がアウトオブボックスのプリズムでautowire機能のために働くべきですプロジェクトのルートフォルダにある "ViewModels"フォルダ(および.ViewModels名前空間)に配置する必要があります。また、あなたの実装していることを確認してくださいhttp://brianlagunas.com/getting-started-prisms-new-viewmodellocator/

:これとどのようにあなたがあなたのブートストラップやApp.xaml.csでViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolverメソッドを呼び出すことにより、デフォルトの規約を変更することができます詳細については、ブライアンLagunas'のブログ記事を参照してくださいたIViewインタフェース:

public partial class ConfigurationWindow() : Window, IView 
{ 
... 
} 
+0

感謝を指してくれてありがとう。この上の私の知識は完全に私は 'model'にデータを充填された方法で台無しました。私は 'ViewModel'でバックアップするのではなく、' ViewModel'で行っていたはずです。上記の例はヒントとその作業を今すぐ行った。 Bdw、私はViewModelを 'ViewModels'ディレクトリの中に置きました。プリモーションはAutowiringのものを世話しました。 –

0

うーん...すべてのObservableCollectionの第一は、INotifyPropertyChangedの実装を、あなたはそれを行う必要はありません。

その後、これは十分です:

public ObservableCollection<ConfigurationDetails> ConfigDetails { get; set; } 


public ConfigurationWindow() 
{ 
    InitializeComponent(); 
    using (_db = new MyEntities()) 
    { 
     var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails() 
    { 
      ConfigFName = x.ConfigFName, 
      ConfigSName = x.ConfigSName, 
      ConfigUName = x.ConfigUName, 
      Id = x.ConfigID 
    }); 
    foreach(var config in configRecords) 
    { 
     model.ConfigDetails.Add(config); 
     } 


    } 
} 

}

+0

申し訳ありませんが、それはしかし...あなたの努力のおかげで問題ではありませんでした。.. –

関連する問題