希望这个问题不是太笼统,但我刚刚开始使用WPF而且我正在敲打这个问题。
我正在开发一个使用动态创建的控件的应用程序。但是目前我无法弄清楚如何创建命令并向当前窗口添加更多控件,因为这些命令仅在ViewModel中创建时无法看到View。但是我无法将所有内容保留在XAML中,因为除了少数最初为空的堆栈面板之外的所有控件都是动态的。我觉得我在这里很容易丢失一些东西。
所以这里我有绑定
<MenuItem Header="LabelMenuItem" Command="{Binding Path=SpawnLabel}"/>
这里我有命令
public ICommand SpawnLabel { get { return new DelegateCommand(OnSpawnLabel); } }
Delegate命令的工作方式类似于此处定义的中继命令。
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原则的情况下与视图对话)以便我可以使用创建的当前控件实际更改UI在c#。
目前,当我这样做时,我得到一个BindingExpression路径错误,这是有道理的,但我无法弄清楚如何绑定它以在视图中查找命令。
答案 0 :(得分:0)
您通过事件间接与UI进行通信,如果您更改了触发PropertyChanged
的属性,则UI将更新绑定,如果更改了您触发的集合CollectionChanged
并添加了新控件或者删除旧的。
重要的界面是INotifyPropertyChanged
和INotifyCollectionChanged
,只需将ItemsControl
(通过ItemsSource
)绑定到视图模型中的ObservableCollection<T>
,然后添加到您的命令中的该集合(您可能需要使用ItemsControl.ItemTemplate
为视图模型指定视图,具体取决于您使用的MVVM框架。