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

メインウィンドウのコマンドにバインドするには、ユーザーコントロールのボタンを使用する必要があると思います。これは、メインウィンドウのビューモデルをusercontrolに渡そうとするよりも優れています。これにより、依存関係が作成され、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>

これは、メインウィンドウのコマンドへの相対バインディングを使用します。私のアプリでは、1つのメインウィンドウを使用してすべてのユーザーコントロール/ビューを保持します。そうすれば、表示される内容を制御し、常に利用できることがわかっている1つの場所でのみコマンド定義を使用できます。

お役に立てれば

于 2013-03-26T04:33:02.427 に答える