WPF MVVMLight RelayCommand не выполняется случайным образом - PullRequest
0 голосов
/ 04 марта 2019

У меня есть кнопка в приложении WPF, которая работает странно, иногда она будет работать совершенно нормально, в других случаях она вообще не будет срабатывать.

Если кнопка не работает, могу ли я перезапуститьПриложение несколько раз, и оно снова будет работать в случайном порядке.Я добавил точку останова Debug на CanScan = false;, и эта точка останова не срабатывает, когда кнопка не работает.

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

Просмотр кода модели: public ICommand OnScanPage {get;задавать;}

    public ScannerViewModel(ScanningService scanningService, Action<int> processingAction)
    {
        this.processingAction = processingAction;
        this.scanningService = scanningService;

        Pages = new ObservableCollection<ScannerPageViewModel>();

        CanScan = true;

        OnScanPage = new RelayCommand(() => {
            try
            {
                CanScan = false;
                processingAction.Invoke(1);

                scanningService.ScanPage(img =>
                {
                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        CanScan = true;
                        processingAction.Invoke(-1);
                        Pages.Add(new ScannerPageViewModel(this, processingAction, img));
                    });
                });
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.Message);
            }
        });
    }

Просмотреть код модели:

<UserControl x:Class="DocumentScanner.Views.Scanner.ScannerUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DocumentScanner.Views.Scanner"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Button Grid.Row="0" Content="Scan page" IsEnabled="{Binding CanScan}" Command="{Binding OnScanPage}" />

        <ListView Margin="0" Grid.Row="1" ItemsSource="{Binding Pages}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto" />
                                <ColumnDefinition Width="auto" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>

                            <Image MaxWidth="200" Source="{Binding Image}" Grid.RowSpan="2" />

                            <Button Command="{Binding Rotate}" Grid.Row="0" Grid.Column="0" Padding="10">Rotate</Button>
                            <Button Command="{Binding Remove}" Grid.Row="0" Grid.Column="1" Padding="10">Remove</Button>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</UserControl>

служба сканирования:

public void ScanPage(Action<BitmapImage> onImage)
{
    Task.Run(() =>
    {
        try
        {
            ImageProcesser.Push(onImage);

            var myDS = selectedSource;
            myDS.Open();

            myDS.Capabilities.CapAutoFeed.SetValue(BoolType.True);
            myDS.Capabilities.CapAutoScan.SetValue(BoolType.True);

            myDS.Enable(SourceEnableMode.NoUI, true, IntPtr.Zero);
            myDS.Close();
        }
        catch (Exception exp)
        {
            Debug.WriteLine(exp.Message);
        }
    });
}

Обновление: Я изменил свой RelayCommand на мойновый ECommand (см. ниже), так как он работает каждый раз сейчас.Я оставляю этот вопрос открытым, так как, должно быть, я делаю что-то не так с RelayCommand.

   public class ECommand : ICommand
    {
        private Action a;

        public ECommand(Action a)
        {
            this.a = a;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            a.Invoke();
        }

        public event EventHandler CanExecuteChanged;
    }
...