从多个视图访问ViewModel

时间:2014-10-02 11:53:29

标签: c# wpf entity-framework mvvm

因此。在基础上我有一个ViewModel(VM),我有三个视图。 所有三个视图都需要将其数据上下文设置为相同的视图模型。

问题是视图模型需要将数据返回到调用它的视图。

虚拟机应该从数据库中获取信息,并在调用时将其加载到第一个视图中的数据网格中。当实例化第二个视图时,它还需要VM为其提供信息以显示在其数据网格/文本框中

现在,如果我只使用一个视图,那么这就足够了:

// This is the ViewModel
class registrationSQL
{
    #region Declarations

    Medcare2.mascamainDataSet mascamainDataSet { get; set; }
    Medcare2.mascamainDataSetTableAdapters.signupTableAdapter mascamainDataSetsignupTableAdapter { get; set; }
    System.Windows.Data.CollectionViewSource signupViewSource { get; set; }

    #endregion

    #region Constructor

    // I pass the user control into the constructor
    public registrationSQL(Medcare2.content.administration.registration.tabs.grid grid)
    {
        //  //Load your data here and assign the result to the CollectionViewSource.
        mascamainDataSet = ((Medcare2.mascamainDataSet)(grid.FindResource("mascamainDataSet")));
        // Load data into the table signup.
        mascamainDataSetsignupTableAdapter = new Medcare2.mascamainDataSetTableAdapters.signupTableAdapter();
        mascamainDataSetsignupTableAdapter.Fill(mascamainDataSet.signup);
        signupViewSource = ((System.Windows.Data.CollectionViewSource)(grid.FindResource("signupViewSource")));
        signupViewSource.View.MoveCurrentToFirst();
    }

    #endregion
}

然后在页面后面的代码中我设置了datacontext并告诉它将自己传递给VM的构造函数

// This is  the view's code behind.
public partial class grid : UserControl
{
    public grid()
    {
        InitializeComponent();

        if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
        {
            // A new instance of LoginSQL is to be created and set as the current datacontext
            DataContext = new registrationSQL(this);
        }
    }
}

这是xaml:

<UserControl.Resources>
    <Medcare2:mascamainDataSet x:Key="mascamainDataSet"/>
    <CollectionViewSource x:Key="signupViewSource" Source="{Binding signup, Source={StaticResource mascamainDataSet}}"/>
</UserControl.Resources>
<Grid Style="{StaticResource ContentRoot}" DataContext="{StaticResource signupViewSource}">

    <DataGrid x:Name="signupDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Margin="10" ItemsSource="{Binding}" EnableRowVirtualization="True" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="tagColumn" Width="SizeToHeader" Header="tag" Binding="{Binding tag}"/>
            <DataGridTextColumn x:Name="idColumn" Width="SizeToHeader" Header="Id" Binding="{Binding Id}"/>
            <DataGridTextColumn x:Name="firstColumn" Width="SizeToHeader" Header="first" Binding="{Binding first}"/>
            <DataGridTextColumn x:Name="secondColumn" Width="SizeToHeader" Header="second" Binding="{Binding second}"/>
            <DataGridTextColumn x:Name="thirdColumn" Width="SizeToHeader" Header="third" Binding="{Binding third}"/>
            <DataGridTextColumn x:Name="lastColumn" Width="SizeToHeader" Header="last" Binding="{Binding last}"/>
            <DataGridTextColumn x:Name="genderColumn" Width="SizeToHeader" Header="gender" Binding="{Binding gender}"/>
            <DataGridTemplateColumn x:Name="dobColumn" Width="SizeToHeader" Header="dob">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding dob, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn x:Name="usernameColumn" Width="SizeToHeader" Header="username" Binding="{Binding username}"/>
            <DataGridTextColumn x:Name="passwordColumn" Width="SizeToHeader" Header="password" Binding="{Binding password}"/>
            <DataGridTextColumn x:Name="questionColumn" Width="SizeToHeader" Header="question" Binding="{Binding question}"/>
            <DataGridTextColumn x:Name="answerColumn" Width="SizeToHeader" Header="answer" Binding="{Binding answer}"/>
            <DataGridTextColumn x:Name="pemailColumn" Width="SizeToHeader" Header="pemail" Binding="{Binding pemail}"/>
            <DataGridTextColumn x:Name="wemailColumn" Width="SizeToHeader" Header="wemail" Binding="{Binding wemail}"/>
            <DataGridTextColumn x:Name="cellColumn" Width="SizeToHeader" Header="cell" Binding="{Binding cell}"/>
            <DataGridTextColumn x:Name="homeColumn" Width="SizeToHeader" Header="home" Binding="{Binding home}"/>
            <DataGridTextColumn x:Name="extColumn" Width="SizeToHeader" Header="ext" Binding="{Binding ext}"/>
            <DataGridTextColumn x:Name="streetColumn" Width="SizeToHeader" Header="street" Binding="{Binding street}"/>
            <DataGridTextColumn x:Name="surbubColumn" Width="SizeToHeader" Header="surbub" Binding="{Binding surbub}"/>
            <DataGridTextColumn x:Name="cityColumn" Width="SizeToHeader" Header="city" Binding="{Binding city}"/>
            <DataGridTextColumn x:Name="regionColumn" Width="SizeToHeader" Header="region" Binding="{Binding region}"/>
            <DataGridTextColumn x:Name="deptColumn" Width="SizeToHeader" Header="dept" Binding="{Binding dept}"/>
            <DataGridTextColumn x:Name="bankColumn" Width="SizeToHeader" Header="bank" Binding="{Binding bank}"/>
            <DataGridTextColumn x:Name="branchColumn" Width="SizeToHeader" Header="branch" Binding="{Binding branch}"/>
            <DataGridTextColumn x:Name="accountColumn" Width="SizeToHeader" Header="account" Binding="{Binding account}"/>
        </DataGrid.Columns>
    </DataGrid>

这就是我需要做的一切。但是,如果我想要多个用户控件来访问VM并将数据返回给它,该怎么办?如何让VM的构造函数接受任何窗口而不仅仅是指定的窗口?或者你能想到的任何其他方法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

通常,你反过来做:在你的Viewmodel中,将来自数据库的数据存储在ObservableCollection或类似的通用对象中 - Viewmodel不应该关心如何呈现这些数据(以及用户控件用于显示数据)。

说到视图:只需将Viewmodel类的实例传递给窗口的DataContext属性,然后将DataGrid的ItemsSource绑定到包含Viewmodel中数据的集合。

使用此设置,对多个窗口重复使用相同的Viewmodel应该不是问题 - 只需对窗口的DataContext属性使用相同的Viewmodel实例! (当然,只有当两个窗口都呈现相同的数据时才有意义......)

相关问题