2016-10-06 3 views
0

Я делание небольшую программу WPF MVVM что:Linking ViewModel класс Просмотр

  1. имеет MainWindow с этикетками (говоря «Привет») и кнопку, чтобы открыть еще одно окно (я сделал открытую часть окна в коде позади).
  2. Это открывает другое окно с двумя переключателями (красный и синий) и кнопкой отмены (я закрыл функцию в коде позади).
  3. Если я нажимаю красный переключатель, надпись на MainWindow должна загораться красным цветом, аналогично нажатию кнопки Blue.

Может ли кто-нибудь помочь мне с этим? Я как бы новичок в 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(); 
      } 
     } 
    } 
} 

Может ли кто-нибудь помочь мне с этим?

Thank You Very Much !!

P.S. Я знаю, что люди могут спросить о необходимости двух окон, но это должно быть так. Мне сказали, что это должно быть так, иначе нет.

+0

Где я смотрю код? и почему вы ссылаетесь на свой MainWindow в ViewModel? –

+0

Разве это не единственный способ получить доступ к ярлыку? –

+0

Нет, это не способ доступа. если вы следуете за MVVM Используйте привязки данных, команды и т. д. Я бы посоветовал вам больше узнать о шаблонах MVVM и WPF, прежде чем писать код –

ответ

0

Прежде всего, вы не должны иметь ссылку на представление в своей модели просмотра. В соответствии с шаблоном MVVM вы должны установить DataContext представления в свою модель просмотра, но viewmodel не должен ничего знать о представлении. Если вы хотите, чтобы ваша команда открывала окно, вы можете использовать службы. Взгляните на это: Opening new window in MVVM WPF

Кроме того, вы можете привязать к цвету переднего плана. В вашем ViewModel вы должны иметь что-то вроде этого:

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

И в XAML с меткой Hello:

<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 на красный или синий, в зависимости от параметра.

+0

Но как это связано с переключателем? Основная цель - использовать переключатели для изменения цвета метки? –

+0

И btw что такое OnPropertyChanged()? И как это реализовать? –

+0

Я отредактировал свой ответ, но я предлагаю вам сначала прочитать введение в привязки, INotifyPropertyChanged и т. Д., Иначе использовать MVVM не имеет смысла. Посмотрите здесь, например: http://www.learnmvvm.com/ – Michelle

Смежные вопросы