0

我是WPF和的新手Prism。使用/Delegate 命令CommandCanExecute()时如何使用 if else 语句?CommandExecute()

我有一个代码来加载和获取实时图表的实例。但是,如果用户桌面中不存在图表文件,我的应用程序将崩溃。我想实现一个 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

4 回答 4

0

你应该更精确。我不知道你的意思。如果您在某个文件中有此图表,请这样做:

在顶部添加此参考:

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();
}
于 2019-04-10T09:53:56.910 回答
0

ICommand实现旨在构建为可绑定命令
DelegateCommand.RaiseCanExecuteChange() 用于在 UI 中启用按钮时进行刷新。
它不打算在命令背后的逻辑中使用。

例如: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;
    }

当 UI 被绑定时,SaveCommand CanExecuteSaveCommand() 方法运行并且让我们假设记录在加载时不是脏的。
诀窍是连接一个事件,以便在更新 MyRecord 时通过调用 _saveCommand.RaiseCanExecuteChanged 启用 UI 按钮

    public MainWindowViewModel(IRecordDataService dataService)
    {
        CurrentRecord = dataService.GetRecord();
        CurrentRecord.Updated += (sender, args) => _saveCommand.RaiseCanExecuteChanged();
    }
于 2019-04-10T12:47:41.900 回答
0

在 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
        }
    }
}

`

于 2019-04-12T17:27:32.913 回答
0

你不应该在它自己的命令中这样做。当您将命令绑定到按钮时,当您无法执行任务时,该按钮将不会被启用。

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

此外,您应该向 UI 添加一条消息(例如,在按钮旁边,或作为工具提示),该消息仅在按钮被禁用时才可见。

于 2019-04-17T08:19:00.740 回答