Как реализовать if, else оператор в команде CanExecute или Delegate в wpf c #? - PullRequest
0 голосов
/ 10 апреля 2019

Я новичок в WPF и Prism. Как использовать оператор if else при использовании команд CommandCanExecute(), CommandExecute() / Delegate?

У меня есть код для загрузки и получения экземпляра живой диаграммы. Однако, если файл для диаграммы не существует на рабочем столе пользователя, мое приложение будет зависать. Я хочу реализовать оператор if else, чтобы сказать, что если вы не можете найти график, вместо сбоя программы выведите окно с сообщением об ошибке.

Я пытался найти RaiseCanExecuteChanged, но не знал, как реализовать.

   private bool BEYieldCommandCanExecute()
    {
        return true;
    }

    private void BEYieldCommandExecute() 

    {
        if (true)
        {
            _eventAggregator.GetEvent<GraphPubSubEvent>().Publish(_viewName);

        }

        else
        {//Check
            MessageBox.Show("Error loading. Please ensure Excel file/Server file exist in Desktop/Server to generate Chart.", "Invalid Request", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }

Большое спасибо !!

Ответы [ 4 ]

0 голосов
/ 17 апреля 2019

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

bool CanExecute()
{
    return File.Exists("some/path/to/file.ext");
}

Кроме того, вы должны добавить сообщение в пользовательский интерфейс (например, рядом с кнопкой или в виде всплывающей подсказки), которое отображается только в том случае, если кнопка отключена.

0 голосов
/ 10 апреля 2019

ICommand Реализации предназначены для сборки в виде связываемых команд
DelegateCommand.RaiseCanExecuteChange () должен обновляться, если кнопка включена в пользовательском интерфейсе.
Он не предназначен для использования в логике команд.

Например: Привязка кнопки сохранения XAML <Button Command="{Binding SaveCommand}" />

Команда ViewModel, в которой кнопка активна только в том случае, если запись должна быть сохранена

    private DelegateCommand _saveCommand;
    public DelegateCommand SaveCommand =>
        _saveCommand ?? (_saveCommand = new DelegateCommand(ExecuteSaveCommand, CanExecuteSaveCommand));

    void ExecuteSaveCommand()
    {
        // Save logic goes here
    }

    private bool CanExecuteSaveCommand()
    {
        var isDirty = CurrentRecord.GetIsDirty();
        return isDirty;
    }

Когда пользовательский интерфейс привязан, выполняется метод SaveCommand CanExecuteSaveCommand (), и давайте предположим, что запись НЕ загрязнена при загрузке.
Хитрость заключается в том, чтобы подключить событие, чтобы при обновлении MyRecord кнопка UI активировалась путем вызова _saveCommand.RaiseCanExecuteChanged

    public MainWindowViewModel(IRecordDataService dataService)
    {
        CurrentRecord = dataService.GetRecord();
        CurrentRecord.Updated += (sender, args) => _saveCommand.RaiseCanExecuteChanged();
    }
0 голосов
/ 12 апреля 2019

В XAML: <Button Command="{Binding OpenDialogCommand }" />

public class ViewModel
{
    public DelegateCommand OpenDialogCommand { get; set; }

    public ViewModel()
    {
        OpenDialogCommand = new DelegateCommand(BrowseFile);
    }

    private void BrowseFile()
    {
        var openDialog = new OpenFileDialog()
        {
            Title = "Choose File",
            // TODO: etc v.v
        };
        openDialog.ShowDialog();
        if (File.Exists(openDialog.FileName))
        {
            // TODO: Code logic is here


        }
        else
        {
            // TODO: Code logic is here
        }
    }
}

`

0 голосов
/ 10 апреля 2019

Вы должны быть более точным.Я не знаю точно, что вы имеете в виду.Если у вас есть этот график в каком-то файле, сделайте это так:

Добавьте эту ссылку сверху:

using System.IO;

, затем в вашем коде проверьте, существует ли файл:

if (!File.Exists("someFile.txt"))
{
CreateFile("someFile.txt");
}
else
{
DoSomeActionWithFile("someFile.txt")
}

Еще один способ сделать это - блок try-catch

try
{
OpenFile("someFile.txt");
}
catch(Exception ex)
{
LogError(ex.toString());
DoSomethingWithInErrorCase();
}
...