WPF MVVM CanExecute метод реализации проблемы - PullRequest
2 голосов
/ 08 июля 2011

Я пытаюсь реализовать приложение WPF MVVM.И я новичок в этой платформе.Все, что мне нужно, это реализовать метод CanExecute для моей SaveCommand

Вот код

Код XML WPF

        <Canvas Height="283" Name="canvas1" Width="321">
            <Label Canvas.Left="6" Canvas.Top="6" Content="First Name" Height="25" Width="91" />
            <Label Canvas.Left="6" Canvas.Top="37" Content="Last Name" Height="25" Width="91" />
            <TextBox Canvas.Left="103" Canvas.Top="10" Height="21"  Width="199" Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Canvas.Left="103" Canvas.Top="37" Height="21"  Width="199" Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}"/>
            <Button Canvas.Left="228" Canvas.Top="241" Content="Save" Height="23" Width="74" Command="{Binding SaveCommand}" />
            <TextBlock Canvas.Left="28" Canvas.Top="110" Height="19" Width="259" Text="{Binding Path=FullName}"/>
        </Canvas>

Код C # ViewModel

    public CustomerViewModel(IEventAggregator eventAggregator, IUnityContainer container, ILoggerFacade logger)
        : base(eventAggregator, container, logger)
    {
        logger.Log("View Model Initialized", Category.Debug, Priority.None);
        InitializeCommands();
    }

    public DelegateCommand<object> SaveCommand { get; set; }

    private string firstName;

    public string FirstName
    {
        get { return firstName; }
        set { 
            firstName = value;
            RaisePropertyChanged("FirstName");
        }
    }

    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { 
            lastName = value;
            RaisePropertyChanged("LastName");
        }
    }
    private string fullName;

    public string FullName
    {
        get { return fullName; }
        set { 
            fullName = value;
            RaisePropertyChanged("FullName");
        }
    }


    private void InitializeCommands()
    {
        SaveCommand = new DelegateCommand<object>(OnSaveCommand, CanSaveExcute);

    }
    private bool CanSaveExcute(object obj)
    {
        if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
            return false;
        return true;
    }

    private void OnSaveCommand(object obj)
    {
        FullName = FirstName + " " + LastName;
    }

Без CanSaveExcute все работает нормально.После настройки CanSaveExcute кнопка остается отключенной и не включается при изменении текста.Насколько я узнал, это путь.

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

Спасибо

1 Ответ

3 голосов
/ 08 июля 2011

Вам также следует вызвать событие «CanExecuteChanged», в противном случае получатель должен будет повторно просмотреть вашу команду, чтобы выяснить, может ли она быть выполнена.Вы можете использовать метод "RaiseCanExecuteChanged", описанный здесь

Редактировать Если вы не возражаете против накладных расходов, вы можете просто позвонить this.SaveCommand.RaiseCanExecuteChanged() после вызоваRaisePropertyChanged("FullName"); в свойствах-установщиков.Если ваш RaisePropertyChanged метод является виртуальным, вы можете поместить RaiseCanExecuteChanged() их.

...