2016-12-06 56 views
1

在我的wpf应用程序中,我使用Prism库将我的viewmodel自动装入我的视图中。我有这个工作自动绑定视图和模型的简单属性。现在我试图绑定一个ObservableCollection<T>数据绑定到DataGrid没有运气。以下是我目前场景的结构。Binding 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只有我们的'ViewModel'被放置在我认识的'Views'存在的相同文件夹中时才需要'IView'。否则,如果我们把它放在'ViewModels'文件夹中,'prism'会照顾对吗? –

+0

那么你的代码中的模型来自哪里(是viewmodel)?顺便说一句,为什么你在代码背后得到你的数据? – 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类应该位于项目根文件夹中的“ViewModels”文件夹(和.ViewModels名称空间中)中。请参考布莱恩拉古纳斯的博客文章,了解更多有关这一点,你怎么可能通过调用ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver方法在你的引导程序或App.xaml.cs更改默认的约定:http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/

另外,还要确保你实现IVIEW接口:

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

感谢提示的朋友。我对这个知识得到了完全搞砸了我被灌数据到'model'的方式。我应该在'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

对不起,但这不是问题..谢谢你的努力,虽然.. –

相关问题