Я использую MVVM для настольного приложения. У меня есть модель под названием Calculator
, которая делает очень дорогие вычисления в собственном потоке. MainViewModel
ссылается на Calculator
и использует рассчитанные результаты. Вид принимает результаты и отображает их.Шаблон для делегирования событий
Проблема заключается в том, что
Calculator
возвращает результаты расчета с помощью события. И я не хочу привязывать представление к событию отCalculator
, потому что использованныйCalculator
может меняться во время выполнения. В качестве решения я дважды использовал одно и то же событие, которое мне не нравится, у кого-то есть лучший подход.
Модель:
public class Calculator
{
public event CalculatedHandler Calculated;
public delegate void CalculatedHandler(object sender, IEnumerable<string> values);
protected void OnCalculated(IEnumerable<string> values)
{
Calculated?.Invoke(this, values);
}
public void Run()
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(Calculate);
}
private void Calculate(object sender, DoWorkEventArgs e)
{
List<string> values = new List<string>();
for (int i = 0; i < 10000; i++)
{
// Do expensive stuff
values.Add(i + "");
OnCalculated(values);
}
}
}
ViewModel:
public class CalculatorViewModel
{
private Calculator calculator;
public event CalculatedHandler Calculated;
public delegate void CalculatedHandler(object sender, IEnumerable<string> values);
protected void OnCalculated(IEnumerable<string> values)
{
Calculated?.Invoke(this, values);
}
public CalculatorViewModel()
{
calculator = new Calculator();
calculator.Calculated += Calculator_Calculated;
}
private void Calculator_Calculated(object sender, IEnumerable<string> values)
{
OnCalculated(values);
}
}
Просмотр XAML:
<Window.DataContext>
<viewmodels:CalculatorViewModel />
</Window.DataContext>
Посмотреть код позади:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContextChanged += MainWindow_DataContextChanged;
}
private void MainWindow_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
CalculatorViewModel viewModel = e.NewValue as CalculatorViewModel;
viewModel.Calculated += ViewModel_Calculated;
}
private void ViewModel_Calculated(object sender, IEnumerable<string> values)
{
// Draw values on the canvas
}
}
Используйте [асинхронный/ждать] (https://msdn.microsoft.com/en-us/library/mt674882.aspx) в модели и модели представления. – Clemens
@Clemens Вы можете мне привести пример по коду выше –
Извините, вы могли бы легко сделать это самостоятельно после прочтения искусства, с которым я связался. – Clemens