Я бы хотел, чтобы ваш ParentViewModel содержал ChildViewModel, и использовал бы DataTemplate, чтобы сообщить WPF, что он должен рисовать ChildViewModel, используя local:AlgorithmTester
Control
Sample ViewModel
public class ParentViewModel
{
// Actual implementation omitted for sake of simplicity
public ChildViewModel TestViewModelA { get; set; }
public ChildViewModel TestViewModelB { get; set; }
}
Sample XAML
<Window>
<Window.Resources>
<!-- Data Template to tell WPF how to draw the ViewModels -->
<DataTemplate DataType="{x:Type local:ChildViewModel}">
<local:AlgorithmTester />
</DataTemplate>
<Window.Resources>
<!-- Put ViewModels in ContentControls and let WPF figure out how to display them -->
<UniformGrid Columns="2">
<ContentControl Content="{Binding TestViewModelA}" />
<ContentControl Content="{Binding TestViewModelA}" />
</UniformGrid>
</Window>
Ваши свойства алгоритма (StartRange, EndRange и т. Д.) И методы (Calculate ()) хранятся в ChildViewModel, а AlgoritmTester является представлением, которое делает ViewModel удобной для пользователя.Например, это выглядело бы следующим образом:
<UniformGrid Columns="2" Rows="4">
<TextBlock Text="Minimum:" />
<TextBox Text="{Binding StartRange}" />
<TextBlock Text="Maximum:" />
<TextBox Text="{Binding EndRange}" />
<TextBlock Text="Elapsed:" />
<TextBox Text="{Binding Elapsed}" />
<Button Content="Calculate" Command="{Binding CalculateCommand}" />
</UniformGrid>
РЕДАКТИРОВАТЬ
Что касается комментария по вышеуказанному вопросу, ваш ParentViewModel будет отвечать за пропуск диапазонав ChildViewModels.
Например, если диапазон является статическим, вы должны установить его при создании:
TestViewModelA = new ChildViewModel();
TestViewModelA.StartRange = 0;
TestViewModelA.EndRange = 10;
Если он динамический, я бы зарегистрировал обработчик события PropertyChanged, который установитдиапазон
void ParentViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "StartRange":
TestViewModelA.StartRange = this.StartRange;
TestViewModelB.StartRange = this.StartRange;
break;
case "EndRange":
TestViewModelA.EndRange = this.EndRange ;
TestViewModelB.EndRange = this.EndRange ;
break;
}
}