質問

アプリケーションのMainWindowに添付された一連のコマンドバインディングがあるアプリケーションを作成しました。

(簡潔にするために簡略化されたコード)

<Window x:Class="DBBrowser.Design.Project.ProjectView" 
...>

    <Window.CommandBindings>
    <Commands:DataContextCommandBinding Command="ProjectCommands:ProjectRoutedCommands.OpenReferenceList" Executed="OpenReferenceList" CanExecute="CanOpenReferenceList"/>
...
</Window.CommandBindings>
</Window>

プロジェクトのViewModelには2つの関数があります。

public bool CanOpenReferenceList(object parameter)
{
    return true;
}

public void OpenReferenceList(object parameter)
{
    var dockedReferenceList = new DockableUniversalListView()       
    {
        Name = "referenceList",
        Title = "Reference List"
    };
    referenceData = dockedReferenceList.DataContext as ReferenceListViewModel;
    if (referenceData != null) referenceData.EvListSelected += WoWObjectListRecieved;

    DockedWindows.Add(dockedReferenceList);
}

詳細をスキップして、このコマンドを呼び出すことができる3つのシナリオがあります。

  1. アプリケーションのメインウィンドウ内のドッカブルコンテンツとして
  2. ドッカブルコンテンツを含む新しいウィンドウコントロールとして
  3. Avalondock経由で窓を「引き裂く」ことによって作成されたFloatingWindowとして

シナリオ#1と#2は、次のコマンドバインディングを使用して完全に機能します。

<Button Margin="2" Content="Validate" Height="23" Name="Validate" Width="75" 
        Command="ProjectCommands:ProjectRoutedCommands.OpenReferenceList" 
        CommandTarget="{Binding Path=MainWindow.DataContext,Source={x:Static Application.Current}}" 
        DockPanel.Dock="Left"
        CommandParameter="{Binding Path=SelectedWoWObjectList}"
        TabIndex="20" HorizontalAlignment="Right"/>

ただし、Avalondockウィンドウを「引き裂く」と、ボタンが塗りつぶします。ただし、スタックトレースでは、Canexecute()が呼び出され、そのボタンのためにTrueを返すことが示されました...しかし、ボタンは無効になっています。

役に立ちましたか?

解決

解決策は、CommandTargetバインディングがnull -application.current.current.mainwindowであったことでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top