Кнопка включения на RelayCommand WPF - PullRequest
0 голосов
/ 26 июня 2018

Кнопка не активируется при включении команды, метод doEnable.Метод нажатия отключает кнопку.Кнопка IsEnabled - это Привязка с открытым свойством ViewModel IsEnable, которое имеет значение true для doEnable.Просьба сообщить, что не так в приведенном ниже коде

XAML:

<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" Click="ButtonBase_OnClick" IsEnabled="{Binding IsEnable}" ></Button>

Window2.cs:

public partial class Window2 : Window
{
    public Window2()
    {
        InitializeComponent();
        DataContext = new ButtonEnableViewModel();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    {
        if(sender is Button btn)
            btn.IsEnabled = false;
    }
}

ButtonEnableViewModel.cs

class ButtonEnableViewModel : INotifyPropertyChanged 
{
    public ButtonEnableViewModel() 
    {
        IsEnable = true;
        DataText = "Click Here";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChange(string name) 
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    private RelayCommand _enableCmd;
    public RelayCommand Enable => _enableCmd ?? (_enableCmd = new RelayCommand(doEnable));

    public bool IsEnable { get; set; }
    public string DataText { get; set; }

    protected void doEnable(object obj) 
    {
        IsEnable = true;
        DataText = "Clicked";
        OnPropertyChange(nameof(IsEnable));
        OnPropertyChange(nameof(DataText));
    }
}

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Обычно вы должны использовать метод CanExecute команды, чтобы отключить Button. Большинство реализаций интерфейса ICommand принимает Predicate<object>, который можно использовать, чтобы указать команде, когда включать команду / кнопку.

В этом случае вы можете просто удалить обработчик событий из выделенного кода и просто обработать команду в модели представления:

<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" IsEnabled="{Binding IsEnable}" />

Это должно работать, так как вы устанавливаете свойство IsEnable в методе Execute команды и инициируете событие PropertyChanged. Как правило, вы не обрабатываете события Click в выделенном фрагменте представления при привязке к команде модели представления.

Если вы используете метод CanExecute команды, вам не нужно связываться со свойством IsEnable:

<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" />

Просмотр модели:

private RelayCommand _enableCmd;
public RelayCommand Enable => _enableCmd ?? (_enableCmd = new RelayCommand(doEnable, x => _isEnabled));

private bool _isEnabled;
public string DataText { get; set; }

protected void doEnable(object obj)
{
    _isEnabled = true;
    Enable.RaiseCanExecuteChanged();
    DataText = "Clicked";
    OnPropertyChange(nameof(DataText));
}
0 голосов
/ 26 июня 2018

Поскольку вы изменяете значение IsEnabled Свойство непосредственно в коде, за которым нарушается привязка

, либо используйте:

(this.DataContext as ButtonEnableViewModel).IsEnable = false; 

, либо реструктурируйте свой код и измените значение свойства IsEnable вСама модель представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...