【问题标题】:What is the name of the viewmodel here?这里的视图模型的名称是什么?
【发布时间】:2015-09-29 09:50:25
【问题描述】:

我有这段代码:

 public partial class MainWindow : Window
    {    
        public CViewModel ViewModel { get; set; }            
        public MainWindow()
        {    
            try
            {
                 InitializeComponent(); // create VM first time
                 try
                 {                         
                     ViewModel = new CViewModel(); // create VM 2nd time
                     ViewModel.topGrid = TopGrid;

在相应的 XAML 中我有这个:

<Window
    .....
    xmlns:c="clr-namespace:CCalc"
    ....
    x:Class="CCalc.MainWindow"
   ....>
    <Window.DataContext>
        <c:CViewModel />
    </Window.DataContext>

我可以看到 CViewModel 实例被创建了两次:一次是由于 InitializeComponent 而由 XAML 代码创建的,另一次是由 new CViewModel() 创建的。 所以我删除了那行代码。但是我该如何设置 topGrid? 换句话说:作为我的数据上下文的视图模型的名称是什么?

【问题讨论】:

  • 为什么需要在代码隐藏中访问视图模型?
  • 因为稍后在程序中我做了一个“topGrid.BindingGroup.CommitEdit();”

标签: c# wpf xaml mvvm


【解决方案1】:

您可以创建任意数量的普通类实例。这两个视图模型实例是不同的。这取决于您要使用哪一个。

要设置您的 topGrid,您必须在代码中访问您的 ViewModel。这可以通过两种方式完成:

// using the one declared in xaml file

    CViewModel vm = (CViewModel)this.DataContext;
    vm.topGrid = TopGrid;

// using a new one

CViewModel vm = new CViewModel();
vm.topGrid = TopGrid;    
this.DataContext = vm;

【讨论】:

    【解决方案2】:

    将您的 ViewModel 属性更改为:

    public CViewModel ViewModel
    {
    get { return DataContext as CViewModel; }
    set { DataContext = value; }
    }
    

    而在 main 你可以这样做:

    public MainWindow()
    {
      InitializeComponent();
      ViewModel = new CViewModel();
      ViewModel.topGrid = TopGrid;
    }
    

    【讨论】:

    • 但是我会建立一个 CViewModel 两次,不是吗?
    • 是的。我应该从 xaml 中删除这部分
    【解决方案3】:

    您可以使用数据上下文访问视图模型

    (this.DataContext as CViewModel).topGrid = TopGrid;
    

    你可以先测试一下,确保它不是空的。

    CViewModel model = (this.DataContext as CViewModel);
    if (model != null)
    {
        model.topGrid = TopGrid;
    }
    

    【讨论】:

      【解决方案4】:

      您应该将dataContext 设置为new CViewModel

      public partial class MainWindow : Window
      {    
          public CViewModel ViewModel { get; set; }            
          public MainWindow()
          {    
              try
              {
                   InitializeComponent(); // create VM first time
                   try
                   {          
                       DataContext = new CViewModel();
      

      然后就像@Xaruth 说的那样打电话

      (this.DataContext as CViewModel).topGrid = TopGrid; 
      

      【讨论】:

        猜你喜欢
        • 2018-06-04
        • 2016-08-16
        • 2011-02-10
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2022-11-30
        • 2012-11-09
        相关资源
        最近更新 更多