这里视图模型的名字是什么

本文关键字:是什么 视图 模型 这里 | 更新日期: 2023-09-27 18:14:55

我有这段代码:

 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实例被创建两次:一次是由XAML代码创建的,因为InitializeComponent,一次是由new CViewModel()创建的。我擦掉这行代码。但是如何设置topGrid呢?换句话说:作为数据上下文的视图模型的名称是什么?

这里视图模型的名字是什么

您可以为一个普通类创建任意数量的实例。这两个视图模型实例是不同的。你想用哪一个由你决定。

要设置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;

ViewModel属性更改为:

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

在main中,你可以这样做:

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

您可以使用数据上下文

访问视图模型
(this.DataContext as CViewModel).topGrid = TopGrid;

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

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

您应该将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;