委派的命令不想工作

时间:2014-08-28 05:41:24

标签: c# wpf xaml delegatecommand

这是另一个漫长的编码日,而且我可能还在寻找一些东西。 但我无法弄清楚我错过了什么

ViewModel中的C#代码

public String MainWindowText { get; set; }
public DelegateCommand CommandClose { get; set; }
public TitlebarViewModel()
{
    MainWindowText = "My Epic Window!";
    CommandClose = new DelegateCommand(CloseMain);
}
public void CloseMain(Object Sender)
{
    App.Current.MainWindow.Close();
}
public class DelegateCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;
    public DelegateCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public virtual bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public virtual void Execute(object parameter)
    {
        _execute(parameter);
    }

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }

    #pragma warning disable 67
    public event EventHandler CanExecuteChanged;
    #pragma warning restore 67
}

Xaml代码:

<Window.DataContext>
    <VM:TitlebarViewModel/>
</Window.DataContext>
<Grid>
    <DockPanel>
        <Image x:Name="Icon" Width="30" Height="30"/>
        <Button x:Name="Close" Content="X" Width="25" Height="25" DockPanel.Dock="Right" Margin="2" Command="{Binding CommandClose}"/>

        <TextBlock x:Name="TitleBarText" Text="{Binding MainWindowText}" TextAlignment="Center" Margin="7"/>
    </DockPanel>
</Grid>

所以MainWindow文本框显示我在c#构造函数中设置的内容,所以我知道datacontext工作正常。 我只是无法弄清楚为什么我无法在点击按钮时触发委托命令。

我知道这可能真的很愚蠢。它的东西很简单,但我一直盯着这个屏幕50分钟,我真的在寻找错误。 特别是当我完成了100次这样的操作时,我的解决方案中的其他控件已经完成了

谢谢你们。

1 个答案:

答案 0 :(得分:0)

好的,按要求。此应用程序使用activeX控件。这种控制有空域问题。所以我用另一个窗口用透明度覆盖了一个窗口。

当你这样做时,你需要几乎重写整个代码来移动/拖动或窗口的任何东西。所以我已经加入了一些代码来允许“当我移动一个窗口移动它时,它”

所以我使用的是这段代码

    private void EventHandlers()
    {
        this.LocationChanged += Titlebar_LocationChanged;
        this.Loaded += Titlebar_Loaded;
        this.PreviewMouseLeftButtonDown += Titlebar_PreviewMouseLeftButtonDown;
        this.PreviewMouseLeftButtonUp += Titlebar_PreviewMouseLeftButtonUp;
        this.MouseDoubleClick += Titlebar_MouseDoubleClick;
    }
然而,请注意。此事件会触发事件处理程序,然后才会触发表单上的任何控件。

我只是将事件处理程序更改为

    private void EventHandlers()
    {
        this.LocationChanged += Titlebar_LocationChanged;
        this.Loaded += Titlebar_Loaded;
        this.MouseLeftButtonDown += Titlebar_PreviewMouseLeftButtonDown;
        this.PreviewMouseLeftButtonUp += Titlebar_PreviewMouseLeftButtonUp;
        this.MouseDoubleClick += Titlebar_MouseDoubleClick;
    }

此按钮在您按下控件中的任何按钮后发生。 是的,因为这似乎是有经验的程序员看起来很愚蠢。即使我们有时会有内存块。 请不要评价我。