Как я могу использовать backgroundworker с MVVM при запуске без привязки команды к кнопке? - PullRequest
0 голосов
/ 29 октября 2018

Сначала мое маленькое приложение WPF скопирует файлы x, и пользователь увидит это на индикаторе выполнения. Я только нахожу способы сделать это с помощью кнопки, команда которой привязана к виртуальной машине. Нет ли способа вызвать все это при запуске без использования кнопки?

Edit:

Это пример, как я пытался:

   public ViewModelDfsync()
    {
        this.instigateWorkCommand =
                new RelayCommand(o => this.worker.RunWorkerAsync(),
                                    o => !this.worker.IsBusy);

        this.worker = new BackgroundWorker();
        this.worker.DoWork += this.DoWork;
        this.worker.ProgressChanged += this.ProgressChanged;
    }


    private readonly BackgroundWorker worker;
    private readonly RelayCommand instigateWorkCommand;

    // your UI binds to this command in order to kick off the work
    public RelayCommand InstigateWorkCommand
    {
        get { return this.instigateWorkCommand; }
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {
        // do time-consuming work here, calling ReportProgress as and when you can
        var files = Directory.GetFiles(@"C:\files");
        var destDir = @"C:\files\newDir";
        foreach (var file in files)
        {
            FileInfo fileName = new FileInfo(file);
            FileInfo destFile = new FileInfo(Path.Combine(destDir, fileName.Name));
            if (destFile.Exists)
            {
                if (fileName.LastWriteTime > destFile.LastWriteTime)
                {
                    fileName.CopyTo(destFile.FullName, true);
                    worker.ReportProgress(CurrentProgress);
                }
            }
            else
            {
                fileName.CopyTo(destFile.FullName);
                worker.ReportProgress(CurrentProgress);
            }
        }
    }

    private void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.CurrentProgress = e.ProgressPercentage;
    }


    private int currentProgress;
    public int CurrentProgress
    {
        get => currentProgress;
        private set
        {
            if (currentProgress != value)
            {
                currentProgress = value;
                RaisePropertyChanged("CurrentProgress");
            }
        }
    }

это мой прогресс в xaml:

<ProgressBar Minimum="0" Maximum="100" Value="{Binding CurrentProgress, Mode=OneWay}" Height="20"/>

1 Ответ

0 голосов
/ 29 октября 2018

Вызовите команду модели представления после загрузки вида / окна, либо программно:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var vm = DataContext as ViewModel;
        vm.YourCommand.Execute(null);
    }
}

... или с помощью триггера взаимодействия в XAML: https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/

<Window x:Class="Mm.HandlingEventsMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        Title="MainWindow" Height="350" Width="525">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded" >
            <i:InvokeCommandAction Command="{Binding YourCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Window>

Ни один из подходов не нарушает шаблон MVVM - оба вызывают команду модели представления из представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...