Delegate Command在基类而不是派生类上执行

时间:2013-01-25 17:34:33

标签: c# inheritance delegates command

我想知道是否有人可以解决我必须解决的问题。

我有一个基本窗口,它有一个委托命令,用于触发一个方法,用于在主窗口中显示特定视图

假设有可能数据可能已损坏并且给定视图可能无法使用,因此我有一个用户控件显示错误消息并且有一个按钮触发此命令以切换到更低级别的视图可以纠正数据的地方。

然后我继承了基本窗口,在我的派生窗口中,我有一个制表符控件,每个都有不同的视图。我重写切换方法以切换到包含我的低级视图的选项卡项。

然后在其他选项卡上,我使用按钮实现用户控件。

我面临的问题是,在第一个选项卡上按钮工作正常,但是在每个后​​续选项卡上,execute方法总是调用基类方法,而不是派生类方法。

我更改选项卡的顺序,它始终是第一个正常工作的选项卡以及无法调用派生方法的后续选项卡。

我可以通过将命令更改为RoutedCommand来解决问题,然后执行始终调用派生方法。

但我很困惑为什么委托命令不起作用,为什么我看到上述行为?

非常感谢任何见解。


是的,我认为代码可能有用:)我添加了一些可能有助于显示我的意图的代码片段。

请注意我已尝试过此代码的许多不同变体,包括使用非静态委托命令和使用自定义委托命令(不是来自prism),但只使用路由命令似乎可以正常工作

基本窗口:

    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>

0 个答案:

没有答案