Делегированная команда не хочет работать

Это был еще один длинный день кодирования, и я, вероятно, что-то просматривал. Но я не могу понять, что я пропустил

Код C# во ViewModel

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#, поэтому я знаю, что текст данных работает нормально. я просто не могу понять, почему я не могу заставить делегированную команду срабатывать при нажатии на кнопку.

Я знаю, что это, наверное, действительно глупо. и это что-то простое, но я смотрел на этот экран в течение 50 минут, и я действительно искал ошибку. особенно, когда я сделал это 100 раз и в других средствах управления по всему моему решению

Спасибо, парни.

1 ответ

Хорошо, как просили. это приложение использует элемент управления 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;
    }

этот триггер происходит после нажатия любой кнопки в элементе управления. Да, как бы глупо это ни казалось опытным программистам. даже у нас иногда есть блоки памяти. пожалуйста, не суди меня.

Другие вопросы по тегам