私が解決しなければならなかった問題に誰かが光を当てることができるのだろうか.
メインウィンドウ内で特定のビューを表示するように設計されたメソッドを起動するデリゲートコマンドを持つベースウィンドウがあります
データが破損している可能性があり、特定のビューが使用できない可能性があるため、エラーメッセージを表示するユーザーコントロールがあり、このコマンドを起動してデータが存在するより低レベルのビューに切り替えるボタンがあります。修正できます。
次に、ベース ウィンドウを継承し、派生ウィンドウに、それぞれ異なるビューを持つタブ コントロールがあります。低レベルのビューを含むタブ項目に切り替えるには、switch メソッドをオーバーライドします。
次に、他のタブで、ボタンを使用してユーザー コントロールを実装します。
私が直面している問題は、最初のタブではボタンが正常に機能することですが、後続の各タブでは、execute メソッドは常に派生クラス メソッドではなく基本クラス メソッドを呼び出します。
タブの順序を変更すると、常に最初のタブが正しく機能し、後続のタブが派生メソッドの呼び出しに失敗します。
コマンドを RoutedCommand に変更することで問題を解決でき、実行すると常に派生メソッドが呼び出されます。
しかし、デリゲート コマンドが機能しない理由と、上記の動作が見られるのはなぜでしょうか?
どんな洞察も大歓迎です。
ええ、コードが役立つと思います:)私の意図を示すのに役立つコードのスニペットをいくつか追加しました。
非静的デリゲート コマンドの使用やカスタム デリゲート コマンド (プリズムからではない) の使用など、このコードのさまざまなバリエーションを試しましたが、ルーティングされたコマンドの使用のみが機能するようです。
ベースウィンドウ:
public static DelegateCommand<object> SwitchToXmlOnError;
public WindowBase()
{
SwitchToXmlOnError = new DelegateCommand<object>(SwitchToXml, CanSwitch);
this.CommandBindings.Add(new System.Windows.Input.CommandBinding(SwitchToXmlOnError));
}
protected bool CanSwitch(object e)
{
return true;
}
protected void SwitchToXml(object e)
{
this.SwitchToXmlErrorExecute(e);
}
protected virtual void SwitchToXmlErrorExecute(object sender)
{
//To be implemented by derived class
}
派生ウィンドウ:
protected override void SwitchToXmlErrorExecute(object sender)
{
//some code to change selected tab item
}
ユーザーコントロールのボタン:
<Button x:Name="lnkOpenXmlDocument" BorderThickness="0" Content="Switch To Xml" Command="inf:WindowBase.SwitchToXmlOnError" CommandParameter="{Binding XmlValidationException}" />
他のビューに実装されたユーザー コントロール:
<appCtrl:XmlErrorCtrl >
<appCtrl:XmlErrorCtrl.Style>
<Style TargetType="{x:Type appCtrl:XmlErrorCtrl}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsXmlValid}" Value="True">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding IsXmlValid}" Value="False">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</appCtrl:XmlErrorCtrl.Style>
</appCtrl:XmlErrorCtrl>
メイン ウィンドウのタブ コントロール: (カスタム タブ コントロールは、SelectedItemChanging イベントを持つ継承されたタブ コントロールに過ぎません。
<Grid>
<ctrl:CustomTabControl x:Name="MainTabControl" SelectionChanging="MainTabControl_SelectionChanging_1" >
<ctrl:CustomTabItem x:Name="GeneralTabItem" Header="{Binding GeneralTabVM.Title}" >
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<view:GeneralTabEnhancedView x:Name="generalDetailsView" MinHeight="650" MinWidth="700" />
</ScrollViewer>
</ctrl:CustomTabItem>
<ctrl:CustomTabItem x:Name="SetingsTabItem" Header="{Binding SettingTabVM.Title}" >
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<view:SettingsView x:Name="settingsView" MinHeight="400" />
</ScrollViewer>
</ctrl:CustomTabItem>
<ctrl:CustomTabItem x:Name="XmlTabItem" DataContext="{Binding XMLEditorTabVM}" Header="{Binding Title}" >
<editor:SyntaxEditor x:Name="MainXmlEditor"
IsReadOnly="{Binding ElementName=DataQueryView, Path=IsReadOnly}"
Foreground="Black" SyntaxHighlighting="XML" Document="{Binding XmlDocument}"
Loaded="MainXmlEditor_Loaded_1" Unloaded="MainXmlEditor_Unloaded_1"/>
</ctrl:CustomTabItem>
</ctrl:CustomTabControl>
</Grid>