我是MVVM的新手.很长时间以来,我一直无法得到这个问题的答案.我不知道问题是否那么困难,或者我没有正确解释.我有MainWindow.Xaml,其中包含一个文本块和一个从文本块接收数据的按钮,现在当我按下按钮时,它应该打开第二个名为tableView.xaml的视图(我已经为它/ Xaml创建了用户控件).
我现在有两个问题(请注意,回答时我正在关注MVVM)?
(1)如何通过关闭当前打开的MainWindow.xaml表单(使用MVVM绑定此按钮单击)从按钮单击中打开此视图“ tableView.xaml”?
我的按钮单击代码必须在此新窗体打开(通过关闭当前MainWindow.xaml)的位置在此处(所以我猜打开tableView.xaml的代码必须仅在此处):
public void SaveExecuted() //some where here i have to open "tableView.Xaml"
{
System.Windows.MessageBox.Show(string.Format("Saved: {0} {1} ", DB_Col.DbName, DB_Col.NumTables));
}
public ICommand SavePersonCommand
{
get
{
if (savePersonCommand == null)
savePersonCommand = new DelegateCommand(new Action(SaveExecuted), new Func<bool>(SaveCanExecute));
return savePersonCommand;
}
}
但是该怎么做呢?
(2)“ tableView.Xaml”必须包含GUI,该GUI将根据我在先前的MainWindow.xaml中在“保存按钮”单击时收到的输入以c#动态编写,并且必须将它们添加到tableView.Xaml中.那么,如何以及在何处编写该C#代码,以便由此c#代码生成的GUI可以呈现在tableView.Xaml上?
简介:可以让我知道如何通过单击按钮打开tableView.Xaml,以及如何在tableView.Xaml上附加/渲染GUI(我知道如何将c#代码编写为Generate GUI,但是在哪里编写该代码,例如它将根据MVVM规则在tableView.Xaml中呈现GUI).
编辑:我觉得仍然亲爱的助手不能理解我想要做什么,所以请查看它以获取更多详细信息:
我要做的是:我有MainWindow.xaml,其中包含文本框“输入表数”,该文本框正在接收来自用户的输入(即他要创建的表数).输入此输入后,用户将单击保存按钮.现在,保存按钮必须关闭MainWindow.xaml,并将启动新的用户控件“ tableView.xaml”.假设他输入4并保存.现在,在新启动的tableView.xaml中,我必须显示文本框,该文本框将收到“表名”,“列的Nmbr”,如果他为列数输入3,则应该再有3个文本框来接收每个名称列和数据类型,最后是主键和保存按钮.
现在该GUI必须重复4次,因为在Mainwondow.xaml中,用户在启动时会动态地在“表数”选项中输入4.因此,我们必须为“ tableView.xaml”中的每个表条目重复此GUI 4次,这就是为什么我在用c#编写代码以生成GUI的原因,并且在GUI生成后,我会将从C#代码获得的GUI呈现到tableView.xaml.现在你明白了吗?如果您知道使用MVVM进行此操作的任何其他方式,那么非常欢迎您给我一些示例.
通过使用C#代码动态生成GUI意味着我必须执行以下操作:
现在,当我在MainWindow.xaml中从用户那里获得输入为4时,我在GUI下重复4次(在一个大容器内进行for循环)并将其呈现为tableView.Xaml(我在c#中这样做,因为我必须动态地重复它根据用户在MainWindow.xaml表单中的选择).
StackPanel stp = new StackPanel();
TextBlock txt1 = new TextBlock();
stp.Children.Add(txt1);
此stp必须转到tableView.xaml,并且必须呈现4个Stackpanel,每个包含面板.
解决方法:
1)您仍然不清楚自己的确切要求,因此很难回答这个问题.您说要“关闭当前的MainWindow.xaml表单”,但似乎表明tableView是一个UserControl.您是否要关闭MainWindow并将其完全替换为一个完全不同的窗口?如果是这样,那有什么意义呢?如果原始的MainWindow正在关闭,为什么不更改该Window的内容?
2)这是一个重要的话题,同样,您将不得不提供有关您要尝试执行的操作的更多信息,但通常使用DataTemplating.首先,为要创建的GUI元素以及包含它们的列表的父VM声明视图模型:
public abstract class GuiItem { } // base class
public class TextBlockVM : GuiItem { }
public class CheckBoxVM : GuiItem { }
public class TextBoxVM : GuiItem { }
public class CustomViewModel : ViewModelBase
{
private GuiItem[] _GuiItems = new GuiItem[]
{
new TextBlockVM{},
new CheckBoxVM{},
new TextBoxVM{}
};
public GuiItem[] GuiItems { get { return this._GuiItems; } }
}
然后,创建一个ItemsControl,将ItemsSource绑定到数组,指定要在其上绘制面板的类型,并包含DataTemplates,这些模板指定如何在GUI中为每个VM模板化:
<ItemsControl ItemsSource="{Binding GuiItems}" Margin="10">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:TextBlockVM}">
<TextBlock Text="This is a TextBlock" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:CheckBoxVM}">
<CheckBox>This is a CheckBox</CheckBox>
</DataTemplate>
<DataTemplate DataType="{x:Type local:TextBoxVM}">
<TextBox Width="100" HorizontalAlignment="Left"/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
结果:
显然,这是一个非常简单的示例,仅用于展示基本思想,在实际应用中,您还需要向视图模型添加字段以指定文本和命令处理程序等