2014-10-02 3 views
-1

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 생성자가 지정된 창만이 아니라 모든 창을 허용하도록하려면 어떻게합니까? 또는 당신이 생각할 수있는 다른 방법으로 인정 될 것입니다.

+0

잘못된 방식으로 처리하고 있습니다. MVVM에서 **보기 **는 abt a ** VM **을 알지만 ** VM **은 **보기 **에 바인딩되어서는 안됩니다. 기본적으로 VM에 통지 할 수있는 목록을 만들어야합니다.이 목록에는 데이터를 모든 그리드에 바인딩해야하며 필요한 각 뷰는 데이터 컨텍스트를이 ViewModel로 설정하고 데이터 소스를 VM에서 알 수없는 목록으로 설정합니다. – Kurubaran

+0

여기 디자인에 대해 이야기하지 않을 것입니다. 일반적으로 제공하는 기능이보기 모델을 사용하는 모든 사용자에게 공통적 인 경우보기 모델을 공유하려고합니다. 이제 가지고있는 뷰 모델이 모두에게 공통적이라고 가정하면 뷰 데이터 컨텍스트를 설정하여 모델을 볼 수 있어야하며 바인딩은 속성 (컬렉션 포함)을 사용하는 모든 작업에서 예상대로 작동해야합니다. 그런데 Inotifypropertychanged 것입니다. – TYY

+0

이 경우 @TYY입니다.보기의 내용을 DataGrid에서 목록으로 변경하면 뷰 코드를 건드리지 않고도 여전히 작동합니다. 문제는 여기에 완전히 별도의 페이지에서 DataGrid 및 양식이 필요합니다. – Offer

답변

1

일반적으로 다른 방식으로 수행합니다. Viewmodel에서 데이터베이스의 데이터를 ObservableCollection 또는 유사한 일반 개체에 저장합니다. Viewmodel은이 데이터가 표시되는 방식을 신경 쓰지 않아야합니다. 사용자 컨트롤은 데이터를 표시하는 데 사용됩니다).

보기에 대해 말하면 : Viewmodel 클래스의 인스턴스를 창 DataContext 속성에 전달하고 DataGrid의 ItemsSource을 Viewmodel 내의 데이터를 보유하는 컬렉션에 바인딩하면됩니다.

이 설정을 사용하면 여러 창에 대해 동일한 ViewModel을 재사용해도 문제가 없어야합니다. 두 창 모두에 동일한 ViewModel 인스턴스를 사용하면됩니다. DataContext 속성! (물론 두 창 모두 동일한 데이터를 표시해야하는 경우에만 의미가 있습니다 ...)

+0

좋아. 이 샷을주는 ... – Offer

+0

관찰 할 수있는 컬렉션이 무엇인지 전혀 모르기 때문에 나는 두 가지 방법으로 googleing을했습니다. 그들은 모두 바인딩에 공통점이 있지만 xaml을 방금 게시 한 추가 코드를 살펴보면 이미 바인딩이 있습니다 (그리고 정적 리소스 데이터 컨텍스트). DataGrid의 기능을 변경하지 않을 것입니까?xaml 코드는 비주얼 스튜디오 자체가 페이지에 드래그 앤 드롭했을 때 완전히 작성되었습니다. – Offer

+0

음, XAML 코드가 정상적으로 보입니다. 두 창 모두에서이 작업을 수행하려면''의 선언을 'App. xaml' 리소스 대신 UserControl 리소스를 여러 Windows/usercontrols에 대한 동일한 Viewmodel 인스턴스를 사용할 수 있어야합니다/ – andreask

관련 문제