Обходной путь для свойства зависимости WPF

#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. Я надеюсь, что так, вы можете уловить мою точку зрения. Поэтому, пожалуйста, будьте более конкретными или предоставьте фрагмент кода. Итак, чтобы я мог найти обходной путь для этого. Спасибо.