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