C# 从嵌套用户控件(MVVM)导出数据

C# 从嵌套用户控件(MVVM)导出数据,c#,wpf,xaml,mvvm,prism,C#,Wpf,Xaml,Mvvm,Prism,我正在寻找一种更好的方法,从模型中获取数据以进行导出。下面我概述了我目前的战略,但我觉得有一个更好的战略 假设我有一个控件NestingView,带有一个文本框、按钮和itemscontrol。该按钮将新的嵌套视图添加到ItemsControl。我的目标是能够导出数据,包括嵌套路径 具体来说,是JSON,但我认为这与问题无关。不过,作为参考,结果如下所示: { "Text": "", "Children": [] } 目前,我提出的嵌套控件的方法是让NestingViewMod

我正在寻找一种更好的方法,从模型中获取数据以进行导出。下面我概述了我目前的战略,但我觉得有一个更好的战略

假设我有一个控件NestingView,带有一个文本框、按钮和itemscontrol。该按钮将新的嵌套视图添加到ItemsControl。我的目标是能够导出数据,包括嵌套路径

具体来说,是JSON,但我认为这与问题无关。不过,作为参考,结果如下所示:

{
    "Text": "",
    "Children": []
}
目前,我提出的嵌套控件的方法是让NestingViewModel包含items控件使用的ObservableCollection。那么,保存就是在集合中迭代集合。。。等等

我相信,这是可行的,但让虚拟机和虚拟机一起运行会让人感觉很肮脏。。。所以我想知道是否有更好的/更容易的/更干净的/更MVVM的方法来做到这一点

为了简洁起见,我在本例中没有使用模型,但假设它会在那里,并包含最终用于导出的验证数据。另外,请注意,我使用的是棱镜

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());
    }
}
但是,让虚拟机与虚拟机一起运行确实让人感觉不舒服

一点也不,这是世界上最正常的事情。我宁愿说没有孩子的视图模型是不寻常的,除非你有一个非常简单的向导式应用程序


此外,在除概念验证以外的所有应用程序中,我都会避免在视图模型中存储原始数据。始终尝试将数据作为模型存储在某些服务中。视图模型的工作是聚合和整理视图的数据。

那么,您是在问代码为什么不起作用,还是在要求改进代码体系结构/模式?我会澄清您的问题,并明确说明您希望读者提供的帮助。询问改进建议“让虚拟机和虚拟机一起使用虚拟机确实感觉不好……所以我想知道是否有更好/更容易/更干净/“更多MVVM”的方法。”我添加了一个更清晰的开场白听起来不错,关于在其他虚拟机中存储虚拟机,我遇到了许多相互矛盾的观点。唯一让我觉得奇怪的是,它基本上排除了棱镜自动布线的用处。是的,数据和业务逻辑都在模型中,这只是一个简化的示例。自动连接仅适用于“根”视图模型,并且仅适用于您首先导航视图模型的情况。
<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>
{
    "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
        }
    ]
}