I have a WPF application that listens to copy events and stores clipboard items in a ListView
. Each ListViewItem
contains a button that executes a command (EditClipboardTextCommand
) to open an EditTextWindow
.
When the application starts, clicking the button works as expected. After minimizing the application to the system tray and restoring it, the button no longer works.
If I minimize the app immediately after launching it and then restore it, the button never works again until I restart the application.
Minimizing the application (MainWindow.xaml.cs):
private void MinimizeApplication()
{
Logger.Debug("Minimizing application.");
if (viewModel is not
{
IsSettingsWindowOpen: false, IsClearAllHistoryWindowOpen: false, IsClearAllHistoryWindowOpen: false
}) return;
Hide();
WindowState = WindowState.Minimized;
}
Restoring the application from the system tray (MainWindow.xaml.cs
):
private void MaximizeApplication()
{
Logger.Debug("Maximizing application.");
if (WindowState != WindowState.Normal)
{
SetWindowsLocation();
Show();
Logger.Debug("Restore the window if it's minimized.");
WindowState = WindowState.Normal;
Logger.Debug("Bring the window to the foreground.");
this.Activate();
Logger.Debug("Temporarily set the window as topmost.");
this.Topmost = true;
this.Topmost = false;
}
else
BringApplicationTtoTheFront();
isApplicationOnFocus = true;
}
private void BringApplicationTtoTheFront()
{
Logger.Debug("Bringing application to the front.");
this.Activate();
this.Topmost = true;
this.Topmost = false;
this.Focus();
}
ListView item with a button (MainWindow.xaml
):
<GridViewColumn Header="Actions" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="Edit"
Command="{Binding DataContext.EditClipboardTextCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
Setting a reference to the main window (MainWindow.xaml.cs
):
public MainWindow()
{
// Set reference to main window in the application.
ReferenceClass.MainWindow = this;
}
The EditClipboardTextCommand
implementation:
using ClipKeeper.Forms;
using ClipKeeper.Source.MVVM.Model;
using ClipKeeper.Source.MVVM.ViewModel;
using ClipKeeper.Source.Utils;
using System;
using System.Windows.Input;
namespace ClipKeeper.Source.Commands
{
internal class EditClipboardTextCommand : ICommand
{
public event EventHandler? CanExecuteChanged;
public BaseViewModel ViewModel { get; set; }
public EditClipboardTextCommand(BaseViewModel viewModel)
{
ViewModel = viewModel;
}
public bool CanExecute(object? parameter)
{
return true;
}
public void Execute(object? parameter)
{
if (parameter is ClipboardItem clipboardItem)
{
EditTextWindow editTextWindow = new EditTextWindow(clipboardItem);
editTextWindow.Owner = ReferenceClass.MainWindow;
ReferenceClass.EditTextWindow = editTextWindow;
ViewModel.EditClipboardTextWindowOpen = true;
editTextWindow.ShowDialog();
ViewModel.EditClipboardTextWindowOpen = false;
}
}
}
}
The command binding works before minimizing but, stops working after restoring from the system tray. Other UI elements in the ListViewItem
remain interactive. No errors are thrown, but clicking the button does nothing.
The EditClipboardTextCommand
should open a new window (EditTextWindow
).
What I’ve tried:
- Verifying that the
DataContext
of the button is still set correctly after restoring the application. - Ensuring the command binding remains active.
- Checking if CanExecuteChanged fires after restoring the application.
- Refreshing the
ListView
.
What could cause the button's command binding to stop working after minimizing and restoring from the system tray? How can I make sure the button remains functional after restoring the application?