将ViewModel类链接到View

时间:2016-10-06 08:55:25

标签: c# .net wpf mvvm

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

  1. 有一个带标签的MainWindow(说" Hello")和一个打开另一个窗口的按钮(我在后面的代码中打开了窗口部分)。
  2. 这将打开另一个窗口,其中包含2个单选按钮(红色和蓝色)和一个取消按钮(我在后面的代码中关闭了功能)。
  3. 如果我按下红色单选按钮,MainWindow上的标签应该变为红色,类似于按下蓝色单选按钮。
  4. 有人可以帮我这个吗?我是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();
                }
            }
        }
    }
    

    有人可以帮我这个吗?

    非常感谢!!

    P.S。我知道人们可能会问两个窗户是否需要,但必须这样。我被告知它必须是这样的,所以别无他法。

1 个答案:

答案 0 :(得分:0)

首先,您不应该在viewmodel中引用该视图。根据MVVM模式,您应该将视图的DataContext设置为viewmodel,但viewmodel应该不知道视图。 如果您希望命令打开一个窗口,则可以使用服务。看看这个:Opening new window in MVVM WPF

此外,您可以绑定前景色。在你的viewmodel中你应该有这样的东西:

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

在带有Hello标签的XAML中:

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

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

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

在SwitchButtonCommand命令的实现中,您可以将ForegroundColor设置为红色或蓝色,具体取决于参数。