Обходной путь свойства зависимости 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.

Другие вопросы по тегам