Экспорт данных из вложенных пользовательских контролей (MVVM) - PullRequest
0 голосов
/ 19 сентября 2018

Я ищу лучший способ получения данных из моделей для экспорта.Ниже я обрисовал в общих чертах, какова моя текущая стратегия, но я чувствую, что есть лучшая.

Предположим, у меня есть элемент управления NestingView с текстовым полем, кнопкой и itemcontrol.Кнопка добавляет новый NestingView в ItemsControl.Моя цель - иметь возможность экспортировать данные, включая путь вложения.

В частности, в JSON, но я думаю, что это не так.Для справки, однако, результат будет выглядеть примерно так:

{
    "Text": "",
    "Children": []
}

В настоящий момент я придумал способ вложения элементов управления, чтобы NestingViewModel содержал ObservableCollection, который используется элементом управления items.Таким образом, сохранение было бы вопросом перебора коллекций в коллекциях ... и т. Д.

Это, я полагаю, работает , но, конечно, это выглядит грязно, когда виртуальные машины с виртуальнымиВМ ... так что мне интересно, есть ли лучший / легкий / чище / "больше MVVM" способ сделать это.

Для краткости я не использую модель в этом примере, но предположим, что она будет там и будет содержать проверенные данные, которые в конечном итоге используются для экспорта.Также обратите внимание, что я использую Prism.

NestingViewModel.cs

public class NestingViewModel : BindableBase
{
    /// <summary>
    /// Initializes a new instance of NestingViewModel
    /// </summary>
    public NestingViewModel()
    {
        NestingViewModels = new ObservableCollection<NestingViewModel>();
        NewNestingView = new DelegateCommand(AddNestingViewModel);
    }

    public ObservableCollection<NestingViewModel> NestingViewModels { get; }

    private String _TextBody;

    /// <summary>
    /// Gets and sets the text body
    /// </summary>
    public String TextBody
    {
        get => _TextBody;
        set => SetProperty(ref _TextBody, value);
    }

    public ICommand NewNestingView { get; }

    /// <summary>
    /// Adds a new NestingViewModel to the collection
    /// </summary>
    private void AddNestingViewModel()
    {
        NestingViewModels.Add(new NestingViewModel());
    }
}

NestingView.xaml

<Border BorderBrush="WhiteSmoke" BorderThickness="5">
<StackPanel Margin="5">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="6*"/>
            <ColumnDefinition Width="4*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="0" Text="{Binding TextBody}"/>
        <Button Grid.Column="2" Content="New" Command="{Binding NewNestingView}"/>
    </Grid>
    <ItemsControl Margin="20 5 0 0" ItemsSource="{Binding NestingViewModels}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <local:NestingView/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    </StackPanel>
</Border>

Пример

Так что в этом примере JSON будет выглядеть следующим образом:

{
    "Text": "Parent",
    "Children": [
        {
            "Text": "ChildA",
            "Children": null
        },
        {
            "Text": "ChildB",
            "Children": [
                {
                    "Text": "ChildB's ChildA",
                    "Children": null
                },
                {
                    "Text": "ChildB's ChildB",
                    "Children": null
                }
            ]
        },
        {
            "Text": "ChildA",
            "Children": null
        }
    ]
}

1 Ответ

0 голосов
/ 19 сентября 2018

но, конечно, кажется грязным иметь виртуальные машины с виртуальными машинами с виртуальными машинами

Вовсе нет, это самая обычная вещь в мире.Я бы скорее сказал, что просмотр моделей без детей необычен, если только у вас нет очень простого приложения, похожего на мастера.

Кроме того, во всех приложениях, кроме проверочных, я бы не стал хранить исходные данные вмодель представления.Всегда старайтесь хранить данные в каком-либо сервисе в качестве моделей.Задача модели представления заключается в агрегировании и обработке данных для представления.

...