将ViewModel类链接到视图

本文关键字:视图 链接 ViewModel | 更新日期: 2023-09-27 18:11:42

我正在做一个小的WPF MVVM程序:

  1. 有一个带有标签的主窗口(说"Hello")和一个打开另一个窗口的按钮(我在后面的代码中做了打开窗口的部分)。
  2. 这打开了另一个窗口,有2个单选按钮(红色和蓝色)和一个取消按钮(我在后面的代码中关闭了函数)。
  3. 如果我按下红色单选按钮,主窗口上的标签应该变成红色,类似地按下蓝色单选按钮。
有人能帮我一下吗?我对WPF有点陌生,对MVVM方法也完全陌生。我张贴我的ViewModel代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Media;
using PocMVVM.Views;

namespace PocMVVM.ViewModel
{
    public class ColorChangeViewModel : ICommand
    {
        //ColorChoiceView colorSelect = new ColorChoiceView();
        //MainWindow mw = new MainWindow();
        public event EventHandler CanExecuteChanged;
        public bool CanExecute(object parameter)
        {
            return true;
            //throw new NotImplementedException();
        }
        public void Execute(object parameter)
        {
           //throw new NotImplementedException();
           ColorChoiceView colorSelect = new ColorChoiceView();
           MainWindow mw = new MainWindow();    
           if((bool)parameter==colorSelect.RedButton.IsChecked.Equals(true)) 
           {
                mw.label.Foreground = Brushes.Red;
                mw.UpdateLayout();
                mw.ShowDialog();
            }
            else if((bool)parameter ==  colorSelect.BlueButton.IsChecked.Equals(true))
            {
                mw.label.Foreground = Brushes.Blue;
                mw.UpdateLayout();
                mw.ShowDialog();
            }
        }
    }
}
有人能帮我一下吗?

非常感谢!!

注:我知道人们可能会问是否需要两个窗户,但必须这样做。我被告知必须是这样的,所以没有别的办法。

将ViewModel类链接到视图

首先,在视图模型中不应该有对视图的引用。根据MVVM模式,应该将视图的DataContext设置为视图模型,但是视图模型不应该知道视图的任何信息。如果您希望命令打开一个窗口,可以使用services。看看这个:在MVVM WPF中打开新窗口

此外,您可以绑定到前景颜色。在你的视图模型中,你应该有这样的东西:

public System.Windows.Media.Brush ForegroundColor
{
    get { return _foregroundColor; }
    set
    {
        _foregroundColor = value;
        OnPropertyChanged("ForegroundColor");
    }
}

在XAML中使用Hello标签:

 <TextBlock Foreground="{Binding Path=ForegroundColor, Mode=TwoWay}" />

对于单选按钮,当你在两种颜色之间切换时,你应该有一个iccommand来响应,并进一步将你的属性ForegroundColor设置为这个值。像这样(在XAML中):

<RadioButton Content="Red" Command="{Binding SwitchButtonCommand}" CommandParameter="Red" />
<RadioButton Content="Blue" Command="{Binding SwitchButtonCommand}" CommandParameter="Blue" />

在SwitchButtonCommand命令的实现中,可以根据参数将ForegroundColor设置为红色或蓝色。