CodeGo.net>如何在WPF中使用MVVM从另一个视图打开一个视图

我是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>

结果:

CodeGo.net>如何在WPF中使用MVVM从另一个视图打开一个视图

显然,这是一个非常简单的示例,仅用于展示基本思想,在实际应用中,您还需要向视图模型添加字段以指定文本和命令处理程序等

上一篇:C#-RowHeaderTemplateSelector对象参数为null


下一篇:文本框中的StringFormat有意义吗?