2015-02-24 2 views
2

У меня есть реле командыреле команда не уволят

public class RelayCommand : ICommand 
{ 

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

    private Action methodToExecute; 

    private Func<bool> canExecuteEvaluator; 

    public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator) 
    { 
     this.methodToExecute = methodToExecute; 
     this.canExecuteEvaluator = canExecuteEvaluator; 
    } 
    public RelayCommand(Action methodToExecute) 
     : this(methodToExecute, null) 
    { 
    } 

     public bool CanExecute(object parameter) 
    { 
     if (this.canExecuteEvaluator == null) 
     { 
      return true; 
     } 
     else 
     { 
      bool result = this.canExecuteEvaluator.Invoke(); 
      return result; 
     } 
    } 

    public void Execute(object parameter) 
    { 
     this.methodToExecute.Invoke(); 
    } 
} 

Мой вид модели

public class ViewModel 
{ 

    public ICommand SearchCommand { get; set; } 


    public ViewModel() 
    { 
     SearchCommand = new RelayCommand(ProcessFile); 
    } 
    void ProcessFile() 
    { 
    } 
//Some code 
} 

Мой .xaml

<Button Width="70" Margin="5" Content="Search" Command="{Binding Path= ViewModel.SearchCommand}" ></Button> 

я есть также установить контекст данных в запуске

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Мой код за

public partial class MainWindow : Window 
    { 
     public ViewModel ViewModel { get; set; } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      ViewModel = new ViewModel(); 


     } 
    } 
+0

Вы, вероятно, хотите, чтобы установить '' DataContext' к ViewModel', а не 'MainWindow'. – Bolu

+0

Вам необходимо реализовать INotifyPropertyChanged в вашем классе ViewModel, чтобы пользовательский интерфейс знал, когда был установлен SearchCommand. –

ответ

1

Удалить установку DataContext в XAML и изменить свой конструктор

public MainWindow() 
{ 
    InitializeComponent(); 
    ViewModel = new ViewModel(); 
    DataContext = ViewModel; 
} 

Ваш XAML является связывание данных контекст к окну, а не экземпляр модели представления, который вы создаете.

Вам также нужно изменить путь к креплениям быть по отношению к DataContext (который теперь ваша модель представления)

<Button Width="70" Margin="5" Content="Search" Command="{Binding Path=SearchCommand}" ></Button> 

<TextBox Width="300" Margin="5" Text="{Binding Path=SearchTextBox}"> </TextBox> 
+0

Привет, steve, у меня есть change constructor.but команда не получает fired.I добавил свойство в моей publicmodel public string SerachTextBox {get; задавать; } и intialize в своем конструкторе на «abc». Теперь я привязан к текстовому полю , но данные не получают dispayed должным образом. –

+0

Привет, steve, я нашел soultion, я изменил свою привязку. Я набрал ошибку. Удалил ViewModel., Теперь это работает отлично. .thanks for solution –

+0

Измененный ответ, включающий изменения привязок, которые должны быть сделаны. –

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