我正在使用MVVm工具包在WPF中编写应用程序,并且在连接视图模型和视图方面存在问题。
该模型是使用ado.net实体框架创建的。
viewmodel:
public class CustomerViewModel
{
private Models.Customer customer;
//constructor
private ObservableCollection<Models.Customer> _customer = new ObservableCollection<Models.Customer>();
public ObservableCollection<Models.Customer> AllCustomers
{
get { return _customer; }
}
private Models.Customer _selectedItem;
public Models.Customer SelectedItem
{
get { return _selectedItem; }
}
public void LoadCustomers()
{
List<Models.Customer> list = DataAccessLayer.getcustomers();
foreach (Models.Customer customer in list)
{
this._customer.Add(customer);
}
}
}
视图(目前没有代码):
<UserControl x:Class="Customers.Customer"
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"
xmlns:vm ="clr-namespace:Customers.ViewModels"
d:DesignHeight="300" d:DesignWidth="300"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" >
<Grid>
<toolkit:DataGrid ItemsSource="{Binding AllCustomers}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" AutoGenerateColumns="True">
</toolkit:DataGrid>
<toolkit:DataGrid ItemsSource="{Binding SelectedItem.Orders}">
</toolkit:DataGrid>
</Grid>
</UserControl>
和dataaccesslayer类:
class DataAccessLayer
{
public List<Customer> customers = new List<Customer>();
public static List<Customer> getcustomers()
{
entities db = new entities();
var customers = from c in db.Customer.Include("Orders")
select c;
return customers.ToList();
}
}
问题是没有显示数据只是因为没有设置数据上下文。我试图在代码隐藏中做到但是没有用。无论如何,我宁愿在xaml文件中这样做。另一个问题是SelectedItem绑定 - 从不使用代码。
答案 0 :(得分:6)
由于这是使用MVVM范例,我将在View的构造函数中实例化ViewModel。我的View / ViewModels通常遵循以下事件序列:
我的ViewModel是从XAML代码隐藏实例化的(抱歉这是在VB.NET中,还没有好好学习C#以便相信自己):
Public Sub New()
MyBase.New()
Me.DataContext = New EditShipmentViewModel(Me) 'pass the view in to set as a View variable
Me.InitializeComponent()
End Sub
最初我希望有像
这样的东西<UserControl>
<UserControl.DataContext>
<Local:EditShipmentViewModel>
</UserControl.DataContext>
</UserControl>
但这并不像我想要的那样有效。
希望有所帮助。
答案 1 :(得分:1)
this您要找的是什么?
答案 2 :(得分:1)
我设置我的viewmodel datacontext与我观察Blend4的方式相同。也就是说,如果我的viewmodel被称为MainViewModel,我会在视图中引用它:
<UserControl.Resources>
<local:MainViewModel x:Key="MainViewModelDataSource" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MainViewModelDataSource}}">
...view xaml stuff
</Grid>
另外,如果您在viewmodel的构造函数中从数据库加载数据,请不要忘记在其周围添加辅助方法,如:
if (!DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
myCollection = new ObservableCollection<Blah>(something);
}
以便visual studio / Blend4在尝试从Designer中的数据库连接中检索数据时不会崩溃。我个人经常在构造函数中加载数据,因为我马上需要它,并且它从启动时缓存在内存中。
:)