#wpf #mvvm #dependency-properties #routed-events
#wpf #mvvm #зависимость-свойства #перенаправленные события
Вопрос:
В MainWindow есть 3 пользовательских элемента управления. У каждого элемента управления есть своя кнопка сохранения. В главном окне есть кнопка Сохранить все.
MainWindow имеет ContentControl, а свойство content привязано к виртуальной машине. Во время выполнения ButtonClickCommand создается экземпляр представления, которому присваивается свойство Content.
Эта кнопка saveAll будет внутренне вызывать методы, связанные с кнопкой сохранения UserControls. Как таковой, saveAll не имеет собственного метода.
Это должно быть реализовано с помощью DependencyProperty.
Однажды я видел этот сценарий, реализованный в бизнес-приложении, но почему-то упустил концепцию, лежащую в его основе.
Я не могу понять, какая логика стояла за этим, но это очень полезная вещь.
Теперь я должен реализовать это, но мне не хватает одной мелочи, я не знаю.
Я надеюсь, что сценарий понятен.
Пожалуйста, помогите мне в этом сценарии с кодом.
Спасибо, VJ
Комментарии:
1. Пока никто не понимает, почему это «должно быть реализовано DependencyProperty». Возможно, вам следует подробнее рассказать use о том, как на самом деле сохраняются ваши пользовательские элементы управления, и объяснить, почему вы полны решимости каким-то образом использовать DependencyProperties.
2. @Joel: Я обновил запрос здесь. Я надеюсь, что это так, это прояснило бы ваше замешательство. Если можно обновить что-то еще, скажите мне.
3. Нет, на самом деле это не так. Ваше дополнение не затрагивает ничего из того, что я упомянул.
Ответ №1:
Поскольку вы упомянули 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).
Комментарии:
1. Это не то решение, которое я ищу. Моя реализация выглядит примерно так. У MainVM есть свойство DependencyProperty, у всех других вспомогательных виртуальных машин есть свойство DependencyProperty. Когда вызывается функция сохранения MainVM, она косвенно вызывает все методы сохранения вложенных представлений.
2. @Varun: За исключением этого загадочно расплывчатого DP, который вы продолжаете упоминать, но не объясняете, ваше описание вашей реализации — это именно то, что продемонстрировал Хади.
3. Интересно, я думаю, что было бы не такой хорошей идеей иметь DependencyProperty в ViewModel. Разве это не должно быть в представлении?
4. Я надеюсь, что использование DP в виртуальной машине может быть подходящим? Что сказать? В виртуальной машине DP присваивается значение и привязывается к DP элемента управления в поле зрения. Разве это не хорошо?
Ответ №2:
Имхо, в этом сценарии нет необходимости в RoutedEvents. Способ, которым я бы решил это: существует Main-ViewModel, который предоставляет 3 свойства с помощью вспомогательных ViewModels. MainViewModel — это Datacontext для окна, а subviewmodels привязаны к datacontext 3 пользовательских элементов управления.
Вспомогательные виртуальные машины предоставляют свойство с помощью команды сохранения. Эта команда привязана к кнопкам сохранения в usercontrols. Основная виртуальная машина предоставляет свойство с помощью команды saveall, которая привязана к кнопке saveAll. Затем в обработчике команды save all вы выполняете итерацию по вспомогательным виртуальным машинам и вызываете save для них.
Комментарии:
1. Я надеюсь, что так, вы можете уловить мою точку зрения. Поэтому, пожалуйста, будьте более конкретными или предоставьте фрагмент кода. Итак, чтобы я мог найти обходной путь для этого. Спасибо.