So. 나는 ViewModel (VM)을 가지고 있으며 세 가지 뷰가 있습니다. 세 뷰 모두 데이터 컨텍스트를 동일한 뷰 모델로 설정해야합니다.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
}
은 다음 페이지의 코드에서 나는 데이터 컨텍스트를 설정하고 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 생성자가 지정된 창만이 아니라 모든 창을 허용하도록하려면 어떻게합니까? 또는 당신이 생각할 수있는 다른 방법으로 인정 될 것입니다.
잘못된 방식으로 처리하고 있습니다. MVVM에서 **보기 **는 abt a ** VM **을 알지만 ** VM **은 **보기 **에 바인딩되어서는 안됩니다. 기본적으로 VM에 통지 할 수있는 목록을 만들어야합니다.이 목록에는 데이터를 모든 그리드에 바인딩해야하며 필요한 각 뷰는 데이터 컨텍스트를이 ViewModel로 설정하고 데이터 소스를 VM에서 알 수없는 목록으로 설정합니다. – Kurubaran
여기 디자인에 대해 이야기하지 않을 것입니다. 일반적으로 제공하는 기능이보기 모델을 사용하는 모든 사용자에게 공통적 인 경우보기 모델을 공유하려고합니다. 이제 가지고있는 뷰 모델이 모두에게 공통적이라고 가정하면 뷰 데이터 컨텍스트를 설정하여 모델을 볼 수 있어야하며 바인딩은 속성 (컬렉션 포함)을 사용하는 모든 작업에서 예상대로 작동해야합니다. 그런데 Inotifypropertychanged 것입니다. – TYY
이 경우 @TYY입니다.보기의 내용을 DataGrid에서 목록으로 변경하면 뷰 코드를 건드리지 않고도 여전히 작동합니다. 문제는 여기에 완전히 별도의 페이지에서 DataGrid 및 양식이 필요합니다. – Offer