2015-09-08 6 views
0

Я изучаю WPF и MVVM на данный момент и имею небольшую проблему.C# WPF MVVM Light CanExecute не распознается

Im, использующий MVVM Light, и я хочу, чтобы некоторые кнопки были отключены после проверки, но не использовали функции.

ViewModelMain:

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Command; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.Entity; 

namespace EF_MVVM_Test 
{ 
    public class ViewModelMain : ViewModelBase 
    { 
     public RelayCommand AddAuthorCommand { get; private set; } 
     public RelayCommand DeleteAuthorCommand { get; private set; } 
     public RelayCommand RefreshCommand { get; private set; } 
     public RelayCommand SaveCommand { get; private set; } 

     public ObservableCollection<Author> Authors { get; set; } 
     private LibraryContext db; 

     private Author _SelectedAuthor; 
     public Author SelectedAuthor 
     { 
      get { return _SelectedAuthor; } 
      set { Set("SelectedAuthor", ref _SelectedAuthor, value); } 
     } 

     private Author _NewAuthor; 
     public Author NewAuthor 
     { 
      get { return _NewAuthor; } 
      set { Set("NewAuthor", ref _NewAuthor, value); } 
     } 

     public ViewModelMain() 
     { 
      db = new LibraryContext(); 
      db.Author.Load(); 
      Authors = db.Author.Local; 

      AddAuthorCommand = new RelayCommand(ExecuteAddAuthorCommand, CanExecuteAddAuthorCommand); 
      DeleteAuthorCommand = new RelayCommand(ExecuteDeleteAuthorCommand, CanExecuteDeleteAuthorCommand); 
      RefreshCommand = new RelayCommand(ExecuteRefreshListCommand); 
      SaveCommand = new RelayCommand(ExecuteSaveCommand); 

      NewAuthor = new Author(); 
     } 

     private void ExecuteAddAuthorCommand() 
     { 
      db.Author.Add(_NewAuthor); 
      NewAuthor = new Author(); 
     } 
     private void ExecuteDeleteAuthorCommand() 
     { 
      db.Author.Remove(SelectedAuthor); 
     } 
     private void ExecuteRefreshListCommand() 
     { 
      db.Author.Load(); 
      Authors = db.Author.Local; 
     } 
     private void ExecuteSaveCommand() 
     { 
      db.SaveChanges(); 
     } 

     private bool CanExecuteAddAuthorCommand() 
     { 
      return (!string.IsNullOrEmpty(NewAuthor.Name) && NewAuthor.Birthday != null); 
     } 
     private bool CanExecuteDeleteAuthorCommand() 
     { 
      return SelectedAuthor != null; 
     } 
    } 
} 

XAML:

<StackPanel> 
     <DataGrid ItemsSource="{Binding Authors}" SelectedItem="{Binding SelectedAuthor}" AutoGenerateColumns="False" Height="200" Margin="5" CanUserAddRows="False" CanUserDeleteRows="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
       <DataGridTextColumn Header="Birthday" Binding="{Binding Birthday}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Name" Margin="5" VerticalAlignment="Center"/> 
      <TextBox Height="25" Width="70" Margin="5" Text="{Binding NewAuthor.Name}"/> 
      <TextBlock Text="Geburtstag" Margin="5" VerticalAlignment="Center"/> 
      <DatePicker Height="25" Width="130" Margin="5" SelectedDate="{Binding NewAuthor.Birthday}"/> 
      <Button Margin="5" Height="25" Width="80" Content="Hinzufügen" HorizontalAlignment="Left" Command="{Binding AddAuthorCommand}"/> 
      <Button Margin="5" Height="25" Width="80" Content="Löschen" HorizontalAlignment="Left" Command="{Binding DeleteAuthorCommand}"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <Button Width="120" Height="25" Content="Speichern" HorizontalAlignment="Left" Margin="5" Command="{Binding SaveCommand}"/> 
      <!--Button Width="120" Height="25" Content="Aktualisieren" HorizontalAlignment="Left" Margin="5" Command="{Binding RefreshCommand}"/--> 
     </StackPanel> 
</StackPanel> 

любые идеи, почему кнопки не используя функции CanExecute?

ответ

0

Командный менеджер WPF вызывает CanExecute, когда он обнаруживает изменения пользовательского интерфейса? Что представляет собой изменение пользовательского интерфейса? Добавление и удаление элементов, некоторые связывание обновлений, визуальные изменения состояния. В принципе, всякий раз, когда WPF чувствует себя так. Это ненадежно.

Как вы можете это сделать? Когда вам нужно обновить RelayCommand, позвоните RelayCommand.RaiseCanExecuteChanged(). Этот метод вызывает событие, которое уведомляет WPF о необходимости переоценки статуса команды.

+0

[Использование RelayCommands] (http://blog.galasoft.ch/posts/2009/ 09/using-relaycommands-in-silverlight-3-and-wpf /), похоже, предлагает использовать [CommandManager.InvalidateRequerySposed Method] (https://msdn.microsoft.com/en-us/library/system.windows.input. commandmanager.invalidaterequeriessposed.aspx) – Filburt

+0

@Filburt Этот метод будет переоценивать каждую 'RelayCommand' и каждую' RoutedCommand'. Ненужное для большинства сценариев, если вы спросите меня. – Gusdor

0

Похоже, у вас такая же проблема, как и я несколько дней назад.

ICommand doesn't work

ICommand.CanExecute не звонит, потому что, конечно, вы не говорите кнопку: «Способность кнопки мыши может измениться, когда я вставляю что-то в TextBox». Таким образом, ваша кнопка не понимает, что он может быть включен, если текст текстового поля меняется. Вы должны явно указать кнопке, что она должна проверять ICommand.CanExecute, когда текст изменяется, путем увеличения события ICommand.CanExecuteChanged при изменении текстового поля tex.

0

Я думаю, что, к сожалению, вам нужно вызвать метод RaiseCanExecuteChanged объектов RelayCommand после назначения SelectedAuthor и перехват изменения свойства объекта NewAuthor.

0

Ваша проблема является пространством имен вы используете:

using GalaSoft.MvvmLight.Command; 

Замените его:

using GalaSoft.MvvmLight.CommandWpf; 
Смежные вопросы