2016-08-30 7 views
0

Я пытаюсь реализовать метод, который позволяет изменить квадратную фигуру на круг. Когда я бегу, теперь есть квадрат, который можно перемещать. В любом случае, как реализовать команду для квадратной кнопки?Реализация BtnSquareCommand/RelayCommand

namespace Square 
{ 
    public class MainViewModel : INotifyPropertyChanged 
    { 

     private double _x; 

     public object Content { get; set; } 

     public double X 
     { 
      get { return _x; } 
      set 
      { 
       _x = value; 
      } 
     } 

     public ICommand BtnSquareCommand = new RelayCommand(); //I'm stuck here 

     public double Y { get; set; } 

     public MainViewModel() 
     { 
      Content = new SquareViewModel(); 
     } 



     private void SetSquare() 
     { 
      Content = new SquareViewModel(); 
     } 
     private void SetCircle() 
     { 
      Content = new SquareViewModel(); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnProperrtyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

    } 
} 

EDIT:

Кнопки уже реализованы, но не их функциональности, так что они ничего

namespace Square 
{ 

    public class MainViewModel : INotifyPropertyChanged 
    { 

     private double _x; 

     public object Content { get; set; } 

     public double X 
     { 
      get { return _x; } 
      set 
      { 
       _x = value; 
      } 
     } 

     public ICommand BtnSquareCommand {get ; set;} 
     public ICommand BtnCircleCommand {get ; set;} 


     public double Y { get; set; } 

     public MainViewModel() 
     { 
      Content = new SquareViewModel(); 
     } 



     private void SetSquare() 
     { 
      Content = new SquareViewModel(); 
     } 
     private void SetCircle() 
     { 
      Content = new CircleViewModel(); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnProperrtyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

     } 

    } 
} 

Что мне делать после этого не делать?

....

namespace Sqaure 
{ 
    public class MainViewModel : INotifyPropertyChanged 
    { 

     private double _x; 

     public object Content { get; set; } 

     public double X 
     { 
      get { return _x; } 
      set 
      { 
       _x = value; 
       OnPropertyChanged("Content"); 
      } 
     } 

     public ICommand BtnSquareCommand { get; set; } 
     void BtnSquareCommand_Click(object obj) 
     { 
      SetSquare(); 
     } 

     public ICommand BtnCircleCommand { get; set; } 
     void BtnCircleCommand_Click(object obj) 
     { 
      SetCircle(); 
     } 

     public double Y { get; set; } 

     public MainViewModel() 
     { 
      Content = new SquareViewModel(); 
      BtnSquareCommand = new RelayCommand(BtnSquareCommand_Click); 
     } 



     private void SetSquare() 
     { 
      Content = new SquareViewModel(); 
     } 
     private void SetCircle() 
     { 
      Content = new CircleViewModel(); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      Console.WriteLine("HEEJ"); 

     } 

     public class RelayCommand : ICommand 
     { 
      readonly Action<object> _execute; 
      readonly Func<bool> _canExecute; 

      public RelayCommand(Action<object> execute, Func<bool> canExecute = null) 
      { 
       if (execute == null) 
        throw new ArgumentNullException(nameof(execute)); 

       _execute = execute; 
       _canExecute = canExecute; 
      } 

      public bool CanExecute(object parameter) 
      { 
       return _canExecute == null || _canExecute.Invoke(); 
      } 

      public event EventHandler CanExecuteChanged 
      { 
       add { CommandManager.RequerySuggested += value; } 
       remove { CommandManager.RequerySuggested -= value; } 
      } 

      public void Execute(object parameter) 
      { 
       _execute(parameter); 
      } 
     } 
    } 
} 
+0

Вы не можете связываться с 'общественной ICommand BtnSquareCommand = новый RelayCommand()' из XAML, если это то, что вы используете. Вам нужно изменить его на 'public ICommand BtnSquareCommand {get; set;} 'like, я предоставил вам ответ в моем ответе ниже –

+0

Вы все еще не используете' public MainViewModel() 'part ... –

ответ

0
public MainViewModel() 
{ 
    Content = new SquareViewModel(); 
    BtnSquareCommand= new RelayCommand(BtnSquareCommand_Click,()=> CanExecute); //I'm stuck here 

} 

public ICommand BtnSquareCommand {get ; set;} 

void BtnSquareCommand_Click(object obj) 
{ 
    //DO YOUR WORK HERE 
} 

Проверьте мой другой ответ относительно того же вопроса. Есть больше объяснений о том, как правильно это сделать: Create a SearchCommand in wpf using Mvvm that loads new data to my list view

EDIT: Вы должны изменить содержание своего участия, а также, что необходимо реализовать INotifyPropertyChanged;

private object _content; 
public object Content 
{ 
    get{return _content;} 
    set 
    { 
     _content = value; 
     OnPropertyChanged("Content""); 
     } 
} 

EDIT EDIT:

Я буду размещать весь класс для вас.

Просто скопируйте его в свой проект.

namespace Sqaure 
{ 
    public class MainViewModel : INotifyPropertyChanged 
    { 
    private double _x; 
    private object _content; 
    public object Content 
    { 
     get{return _content;} 
     set 
     { 
      _content = value; 
      OnPropertyChanged("Contenct"); 
     } 
    } 

    public double X 
    { 
     get { return _x; } 
     set 
     { 
      _x = value; 
      OnPropertyChanged("X"); 
     } 
    } 

    public ICommand BtnSquareCommand { get; set; } 

    void BtnSquareCommand_Click(object obj) 
    { 
     SetSquare(); 
    } 

    public ICommand BtnCircleCommand { get; set; } 
    void BtnCircleCommand_Click(object obj) 
    { 
     SetCircle(); 
    } 

    public double Y { get; set; } 

    public MainViewModel() 
    { 
     Content = new SquareViewModel(); 
     BtnSquareCommand = new RelayCommand(BtnSquareCommand_Click); 
     BtnCircleCommand = new RelayCommand(BtnCircleCommand_Click); 
    } 

    private void SetSquare() 
    { 
     Content = new SquareViewModel(); 
    } 
    private void SetCircle() 
    { 
     Content = new CircleViewModel(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     Console.WriteLine("HEEJ"); 

    } 
} 

public class RelayCommand : ICommand 
    { 
     readonly Action<object> _execute; 
     readonly Func<bool> _canExecute; 

     public RelayCommand(Action<object> execute, Func<bool> canExecute = null) 
     { 
      if (execute == null) 
       throw new ArgumentNullException(nameof(execute)); 

      _execute = execute; 
      _canExecute = canExecute; 
     } 

     public bool CanExecute(object parameter) 
     { 
      return _canExecute == null || _canExecute.Invoke(); 
     } 

     public event EventHandler CanExecuteChanged 
     { 
      add { CommandManager.RequerySuggested += value; } 
      remove { CommandManager.RequerySuggested -= value; } 
     } 

     public void Execute(object parameter) 
     { 
      _execute(parameter); 
     } 
    } 
    } 
+0

Что мне делать с CanExecuteChanged? Он никогда не использовался –

+0

Проверьте редактирование, вы можете предоставить любой bool вместо CanExecute, если ничего не указано, ваша кнопка всегда будет включена. –

+0

Можете ли вы проверить отредактированный код, который я загрузил? Могу ли я попросить вас показать мне, как в моем коде? –