C# 尽管ICommand.CanExecute的计算结果为true,但按钮已禁用
我有两个WPF项目,一个是.NET4.7DLL,另一个是桌面应用程序 在我的dll中,我有Viewport2D和ViewportCommands类 My Viewport2D绑定ctor中的那些命令:C# 尽管ICommand.CanExecute的计算结果为true,但按钮已禁用,c#,.net,wpf,commandbinding,C#,.net,Wpf,Commandbinding,我有两个WPF项目,一个是.NET4.7DLL,另一个是桌面应用程序 在我的dll中,我有Viewport2D和ViewportCommands类 My Viewport2D绑定ctor中的那些命令: public Viewport2D() { ... CommandBindings.Add(new CommandBinding(NavigationCommands.IncreaseZoom, ExecuteZoomIn, CanZoom));
public Viewport2D()
{
...
CommandBindings.Add(new CommandBinding(NavigationCommands.IncreaseZoom, ExecuteZoomIn, CanZoom));
CommandBindings.Add(new CommandBinding(NavigationCommands.DecreaseZoom, ExecuteZoomOut, CanZoom));
CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), CanZoom));
CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true));
...
}
如您所见,ResetView命令的计算结果始终为true。ZoomFit命令在大多数情况下也计算为true,并且两个函数都被调用,我已经检查过了
在我的WPF应用程序中,我使用此控件:
<controls1:Viewport2D x:Name="Zoombox" ...>
<controls1:Viewport2D.InputBindings>
<MouseBinding Gesture="{wpfUtils:MouseWheel Direction=Down}" Command="DecreaseZoom" CommandTarget="{Binding ElementName=Zoombox}" />
<MouseBinding Gesture="{wpfUtils:MouseWheel Direction=Up}" Command="IncreaseZoom" CommandTarget="{Binding ElementName=Zoombox}" />
</controls1:Viewport2D.InputBindings>
...
</controls1:Viewport2D>
...
<Button Content="100%" Width="70" Command="controls1:ViewportCommands.ResetView" />
<Button Content="Zoom Fit" Width="70" Command="controls1:ViewportCommands.ZoomFit" />
递增缩放和递减缩放来自.Net的NavigationCommands类部分
上述代码段中的两个按钮始终处于禁用状态,尽管它们应该处于启用状态。但是,使用两个缩放命令进行缩放效果很好
我做错了什么?我做了一个测试
如果绑定在用户控件中,则该绑定不起作用;如果我切换到MainWindow,它会工作…两者的xaml相同
--好--
--坏的--
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:UserControl1></local:UserControl1>
<Button Content="100%" Width="70" Command="local:ViewportCommands.ResetView" />
<Button Content="Zoom Fit" Width="70" Command="local:ViewportCommands.ZoomFit" />
</StackPanel>
</Window>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), (o, e) => e.CanExecute = true));
CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true));
}
public void ZoomFit()
{
}
public void Reset()
{
}
}
visual studio的输出窗口中是否存在任何绑定错误??因为我发现绑定Viewport2D=手势很奇怪,看起来还行///但是ViewportCommands中一些静态命令上的按钮不一样???尝试一下对命令的引用是绝对正确的。我没有收到任何错误或异常。Command={Bindig ElementName=Zoombox,Path=ResetView}应该如何工作?ResetView不是Viewport2D的成员,而是ViewportCommands的成员。不确定…然后更改为类似命令的内容={Binding controls1:ViewportCommands.reset在窗口中查看或移动这两个命令的绑定代码,因为它在Viewport2D中,实际上这两者都是问题。正如我所说的,绑定到Viewport2D中的那些命令的方法被调用。我已经验证了这一点。类似Command=controls1:ViewportCommands.Res的命令引用etView也是有效的。我在代码中的任何地方都使用它,而且它是有效的。这不是我想要的解决方案,但它是有效的。谢谢
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), (o, e) => e.CanExecute = true));
CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true));
}
public void ZoomFit()
{
}
public void Reset()
{
}
}
public static class ViewportCommands
{
public static RoutedCommand ResetView { get; } = new RoutedCommand(nameof(ResetView), typeof(ViewportCommands));
public static RoutedCommand ZoomFit { get; } = new RoutedCommand(nameof(ZoomFit), typeof(ViewportCommands));
}
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:UserControl1></local:UserControl1>
<Button Content="100%" Width="70" Command="local:ViewportCommands.ResetView" />
<Button Content="Zoom Fit" Width="70" Command="local:ViewportCommands.ZoomFit" />
</StackPanel>
</Window>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), (o, e) => e.CanExecute = true));
CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true));
}
public void ZoomFit()
{
}
public void Reset()
{
}
}