0

我有一个包含单个 ContentControl 的 MainView,ContentControl 在应用程序加载时加载默认用户控件。

<ContentControl x:Name="MainContentArea" Content="{Binding ActiveControl}"/>

加载的用户控件,加载一些插件(不相关),并在从组合框中选择一个项目时,它使用 MVVM Light 的 ViewModelLocator 概念触发存在于 Parent(MainViewModel) 中的 ICommand。

private void CreateSelectedPlugin(IExtendedUIViewFactory plugin)
    {
        var pluginStartControl = plugin.Create();
        _locator.Main.DefaultCommand.Execute(pluginStartControl);
    }

问题是 ContentControl 没有更新,我可以设置断点并查看命令在 MainViewModel 中执行,并且我发送的变量有效。

public ICommand DefaultCommand { get; set; }
    public MainWindowViewModel()
    {
        DefaultCommand = new RelayCommand<object>(LoadSection, o => true);
    }

    private void LoadSection(object plugin)
    {
        ActiveControl = plugin;
        //does not matter if i set it to null here
    }

从 MainView/MainViewModel 调用仅将 ContentControl 设置为 null 的 LoadSection 或 testfunction,它按预期工作。

我从控件中发送的命令对 Contentcontrol 有什么保留,使其不想加载其他内容?

4

1 回答 1

0

您需要通知 UI 发生了变化。实现 INotifyPropertyChanged 并将其添加到 ActiveControl 分配中:

private void LoadSection(object plugin)
{
    ActiveControl = plugin;
    NotifyPropertyChanged();
}

这是文档

编辑#1

我认为您应该使用用户控件中的按钮绑定到主窗口中的命令。这比尝试将主窗口视图模型传递给用户控件要好,后者会创建依赖关系并违反 MVVM 模式。在您给我的示例中将此按钮添加到您的 usercontrol1

        <Button Content="Set MyContent to null using binding to main window command" Height="40" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.PublicCommand}"></Button>

它使用相对绑定到主窗口中的命令,在我的应用程序中,我使用一个主窗口来保存所有用户控件/视图。这样我就可以控制显示的内容,并且只在一个我知道总是可用的地方使用命令定义。

希望这可以帮助

于 2013-03-26T04:33:02.427 回答