在一个线程中启动一个很棒的copyprocedure,并在MVVM的一个额外窗口(对话框)中显示一个进度条

时间:2015-09-29 11:36:13

标签: c# wpf xaml mvvm


我有一个MVVM模式,我用它来显示进度条。它工作,所以我认为MVVM模式本身仍然有效。但现在我改变了整个应用程序,我想做以下事项:
打开一个新窗口/对话框并显示进度。此用户不应该将窗口置于后台(如ShowDialog) 该窗口应该能够显示ProgressBar并对从主窗口内部更改的ViewModel做出反应。它看起来像这样:

private void TransferMedia_OnClick(object sender, RoutedEventArgs e)
{
    // ...
    Thread newThread = new Thread(() => CopyUpdatesToClients(2));
    newThread.Start();
    ProgressWindow progressWindow = new ProgressWindow { Owner = this };
    progressWindow.ShowDialog();
    // ...
}

private void CopyUpdatesToClients(int i)
{
    List<XmlFunctions.ClientEntry> clientList = _xml.GetClientsList();
    MyProgressBarViewModel.SetMaximum(clientList.Count);
    MyProgressBarViewModel.SetMinimum(0);
    foreach (XmlFunctions.ClientEntry clientEntry in clientList)
    {
        // Code for copying a mass of files here
        MyProgressBarViewModel.RaiseValue();
    }
}

ProgressWindow看起来像这样:

XAML:

<Window x:Class="AdminConsole.ProgressWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:adminConsole="clr-namespace:AdminConsole"
    Title="Copying in progress..." Height="60" Width="500">
    <Grid>
        <ProgressBar Name="MyProgressBar" Value="{Binding ProgressValue}" Minimum="{Binding MinValue}" Maximum="{Binding MaxValue}"
                     ValueChanged="MyProgressBar_OnValueChanged">
            <ProgressBar.DataContext>
                <adminConsole:ProgressBarViewModel />
            </ProgressBar.DataContext>
        </ProgressBar>
    </Grid>
</Window>

类代码:

using System;
using System.Windows;

namespace AdminConsole
{
    public partial class ProgressWindow
    {
        public ProgressWindow()
        {
            InitializeComponent();
        }

        private void MyProgressBar_OnValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (Convert.ToInt32(MyProgressBar.Value) == Convert.ToInt32(MyProgressBar.Maximum))
            {
                Close();
            }
        }
    }
}

我对此感到非常头疼。我必须承认:我真的不懂MVVM。当我逐步完成它时,ViewModel-Value-Raise运行良好。价值提升,但ProgressBar一直保持灰色。它最终甚至没有被填满。我认为这是一个有约束力的问题 如何正确地将SubWindow的ProgressBar绑定到ViewModel? p.s。:如果看起来很奇怪,它可能是尝试的一个老部分。我多次更改此代码以找到解决方案,但没有找到。
提前感谢您的帮助。

0 个答案:

没有答案