0

我想知道是否有人可以对我刚刚解决的问题有所了解。

我有一个基本窗口,它有一个委托命令,该命令触发一种方法,该方法旨在使主窗口中的特定视图可见

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

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

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

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

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

我可以通过将命令更改为 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>
4

0 回答 0