Обходной путь свойства зависимости WPF
В MainWindow есть 3 пользовательских элемента управления. Каждый элемент управления имеет свою собственную кнопку Сохранить. Главное окно имеет кнопку SaveAll.
MainWindow имеет ContentControl, а свойство content привязано к виртуальной машине. Во время выполнения на ButtonClickCommand экземпляр создается и присваивается свойству содержимого.
Эта кнопка SaveAll будет вызывать методы, связанные с кнопкой Сохранить UserControls. Таким образом, SaveAll не имеет своего собственного метода.
Это должно быть реализовано DependencyProperty.
Однажды я видел, как этот сценарий реализован в бизнес-приложении, но почему-то упустил концепцию, стоящую за ним.
Я не могу понять, в чем была логика, но это очень полезная вещь.
Теперь я должен реализовать это, но мне не хватает мелочи, я не знаю.
Я надеюсь, что сценарий ясен.
Пожалуйста, помогите мне в этом сценарии с кодом.
Спасибо, VJ
2 ответа
Так как вы упомянули MVVM, вот что вы можете искать. Имейте в виду, это будет намного чище и проще, если вы используете среду MVVM, такую как Caliburn, но для этого примера это просто ванильный MVVM:
public class MainViewModel
{
public MainViewModel()
{
ViewOneModel = new SubViewModel();
ViewTwoModel = new SubViewModel();
Children = new List<SubViewModel>(new[] { ViewOneModel, ViewTwoModel });
}
public void SaveAll()
{
foreach(var child in Children)
{
child.Save();
}
}
public IList<SubViewModel> Children { get; private set; }
public SubViewModel ViewOneModel { get; set; }
public SubViewModel ViewTwoModel { get; set; }
}
public class SubViewModel
{
public void Save()
{
}
}
и в пользовательском интерфейсе у вас в основном есть подпредставления (UserControls), составленные в вашем главном представлении:
<StackPanel>
<Button Width="100" Height="20" Content="Save All" />
<local:ViewOne DataContext="{Binding ViewOneModel}" />
<local:ViewTwo DataContext="{Binding ViewTwoModel}" />
</StackPanel>
Вам просто нужно привязать методы сохранения к вашим кнопкам, используя интерфейс ICommand (предпочтительно экземпляр RelayCommand).
Imho в этом сценарии нет необходимости в RoutedEvents. Я бы решил это: есть Main-ViewModel, которая предоставляет 3 свойства с помощью Sub-ViewModel. MainViewModel - это Datacontext для окна, а подвидомодели привязаны к datacontext из 3 пользовательских элементов управления.
Sub vm выставляют свойство с помощью команды Save. Эта команда привязана к кнопкам сохранения в пользовательских элементах управления. Основной vm предоставляет свойство с помощью команды saveall, которая связана с кнопкой SaveAll. Затем в обработчике команды save all вы перебираете подчиненные виртуальные машины и вызываете для них команду save.