Есть пара вещей, которые вы можете сделать.
Я создал много проектов, в которых представление при запуске создает элементы управления, в которых видимость установлена на Скрытый. Затем виртуальная машина создает / имеет свойство State, которое определяет различные состояния приложения. При изменении этого свойства (через INotifyPropertyChanged
) элементы управления на экране появляются или скрываются.
Работая с # 1 или без него, можно создавать команды, которые представление может процесс , но который инициируется виртуальной машиной или где-либо еще. Следовательно, сохраняя разделение интересов.
# 1
Определить Enum
public enum OperationState
{
Select = 1,
Routine,
Alignment,
SerialNumber,
}
На ВМ определить состояние
private OperationState _State;
public OperationState State
{
get => _State;
set { _State = value; OnPropertyChanged(nameof(State)); }
}
Установите необходимое состояние, например, State = Select
.
Иметь видимость элементов управления в зависимости от состояния
<Control:AlignmentProcessing
ProjectContainer="{Binding CurrentContainer, Mode=TwoWay}"
Visibility="{Binding State, Converter={StaticResource VisibilityStateConverter},
ConverterParameter=Alignment}"/>
Вышеуказанный элемент управления будет виден только во время Alignment
state.
Код преобразователя
/// <summary>
/// Take the current state, passed in as value which is bound, and check it against
/// the parameter passed in. If the names match, the control should be visible,
/// if not equal, then the control (window really) should be collapsed.
/// </summary>
public class OperationStateToVisibility : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value != null) &&
(parameter != null) &&
value.ToString().Equals(parameter.ToString(), StringComparison.OrdinalIgnoreCase)
? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotImplementedException();
}
# 2 В противном случае выполните командную операцию на виртуальной машине, например:
public ICommand ShowControl1 { get; set; }
Затем в представлении подписаться на команду (при условии, что VM
содержит текущую виртуальную машину):
VM.ShowControl1 = new Commanding((o) =>
{
SomeUserControl uc = new SomeUserControl();
uc.DataContext = new SomeUserControlViewModel();
UserControl = uc;
}
Затем, когда команда выполняется (из виртуальной машины), представление выполняет свою работу.
ShowControl1.Execute(null);
Я предоставляю командный пример в своем блоге Xaml: MVVM Пример для более простой привязки