希望这个问题不是太笼统,但我刚刚开始使用 WPF,我正在努力解决这个问题。
我正在开发一个使用动态创建的控件的应用程序。但是目前我无法弄清楚如何使命令创建并向当前窗口添加更多控件,因为这些命令仅在无法看到视图的 ViewModel 中创建时才有效。但是,我不能将所有内容都保留在 XAML 中,因为除了一些最初为空的堆栈面板之外的所有控件都是动态的。我觉得我在这里错过了一些简单的东西。
所以在这里我有绑定
<MenuItem Header="LabelMenuItem" Command="{Binding Path=SpawnLabel}"/>
在这里我有命令
public ICommand SpawnLabel { get { return new DelegateCommand(OnSpawnLabel); } }
委托命令的工作方式类似于此处定义的中继命令。
public class DelegateCommand : ICommand
{
private readonly Action _command;
private readonly Func<bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public DelegateCommand(Action command, Func<bool> canExecute = null)
{
if (command == null)
throw new ArgumentNullException();
_canExecute = canExecute;
_command = command;
}
public void Execute(object parameter)
{
_command();
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute();
}
}
这在视图模型中有效,但我无法弄清楚如何使其在视图中工作(或在不破坏 MVVM 原则的情况下与视图对话),以便我可以使用在 c# 中创建的当前控件实际更改 UI。
目前,当我这样做时,我得到一个 BindingExpression 路径错误,这是有道理的,但我无法弄清楚如何绑定它以在视图中查找命令。