如何设置用户控件的datacontext

EVA*_*EVA 6 data-binding wpf mvvm

我正在使用MVVm工具包在WPF中编写应用程序,并且在连接viewmodel和view时遇到问题.

该模型使用ado.net实体框架创建.

视图模型:

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);
            }
            }
        }
Run Code Online (Sandbox Code Playgroud)

和视图(目前没有代码):

<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>
Run Code Online (Sandbox Code Playgroud)

和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();
        }


    }
Run Code Online (Sandbox Code Playgroud)

问题是没有显示数据只是因为没有设置数据上下文.我试图在代码隐藏中做到但是没有用.无论如何,我宁愿在xaml文件中这样做.另一个问题是SelectedItem绑定 - 从不使用代码.

Cod*_*ior 5

由于这是使用MVVM范例,我将在View的构造函数中实例化ViewModel.我的View/ViewModels通常遵循以下事件序列:

  1. 视图已实例化
  2. 查看构造函数实例ViewModel
  3. ViewModel初始化
  4. ViewModel运行数据获取程序(单独的线程)
  5. ViewModel调用OnPropertyChanged("")来警告View某些内容已发生变化; 检查一切

我的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
Run Code Online (Sandbox Code Playgroud)

最初我希望有类似的东西

<UserControl>
    <UserControl.DataContext>
        <Local:EditShipmentViewModel>
    </UserControl.DataContext>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

但这并没有像我想要的那样成功.

希望有所帮助.


Chr*_*col 0

是您要找的吗?

  • 在 XAML 中声明对象的唯一主要问题是,在 VM 构造期间引发的任何错误都将被 XAML 解析错误所吞噬。我们已转而使用像 MEF 这样的 DI 在加载时将 VM 注入到视图的 DataContext 中。OnLoad 可以多次触发,因此请确保使用 _isLoaded 字段或类似字段将其短路。 (2认同)