我有一个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。:如果看起来很奇怪,它可能是尝试的一个老部分。我多次更改此代码以找到解决方案,但没有找到。
提前感谢您的帮助。