我是WPF
和Prism
的新手。使用CommandCanExecute()
,CommandExecute()
/ Delegate命令时如何使用if else语句?
我有一个代码来加载并获取livechart的实例。但是,如果用户桌面中不存在图表文件,我的应用程序将崩溃。我想实现一个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);
}
}
非常感谢!!
在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
}
}
}
`
ICommand
实现旨在构建为可绑定命令
如果在UI中启用了按钮,则会刷新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;
}
绑定UI时,运行SaveCommand CanExecuteSaveCommand()方法,并假设加载时记录不脏。 诀窍是连接事件,以便在更新MyRecord时通过调用_saveCommand.RaiseCanExecuteChanged启用UI按钮
public MainWindowViewModel(IRecordDataService dataService)
{
CurrentRecord = dataService.GetRecord();
CurrentRecord.Updated += (sender, args) => _saveCommand.RaiseCanExecuteChanged();
}
你应该更精确。我不知道你的意思。如果您在某个文件中有此图表,请执行以下操作:
在顶部添加此参考:
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();
}
你不应该在它自己的命令中这样做。将命令绑定到按钮时,如果无法执行任务,则不会启用该按钮。
bool CanExecute()
{
return File.Exists("some/path/to/file.ext");
}
此外,您应该向UI添加消息(例如,在按钮旁边,或作为工具提示),只有在禁用按钮时才会显示该消息。