0

私のプロジェクト (MVVM パターンを使用した Silverligth) には、2 つのビュー (Customer および CustomerDetails ページ) があります。顧客ページには、既にロードされている選択したプロジェクトを開くためのListView1 つと 1 つがあります。ButtonListView

ListViewXAML コーディング:(Customer.xaml)

 <ListBox ItemsSource="{Binding Projects,Mode=TwoWay}"       
             SelectedItem="{Binding Project,Mode=TwoWay}" SelectionMode="Single">
       <ListBox.ItemsPanel>
          <ItemsPanelTemplate>
          </ItemsPanelTemplate>
       </ListBox.ItemsPanel>
       <ListBox.ItemTemplate>
         <DataTemplate>
               <TextBlock Text="{Binding ProjectName,Mode=OneWay}" />
         </DataTemplate>
       </ListBox.ItemTemplate>
  </ListBox>



    <TextBlock Name="CustomerName" Text="{Binding Customer.CustomerName}" />
      <TextBlock Name="ProjectName"  Text="{Binding Project.ProjectName,Mode=OneWay}"/>
      <TextBlock Name="Description" Text="{Binding Project.Description}" />
      <HyperlinkButton Content="Open" Click="HyperlinkButton_Click"></HyperlinkButton>

実際に、任意の projectFile Name を選択してからハイパーListViewリンクをクリックすると、Customer View に完全にButtonバインドされる値を取得していることを意味します。TextBlock

しかし、私の要件は、CustomerDetails ページに移動するときに、同じ (バインドされた) 値がバインドされることです。

顧客 (コード ビハインド) ページ:

private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
   {
    iRegionManager.RegisterViewWithRegion("RootRegion", typeof(View.CustomerDetails));
    iRegionManager.RequestNavigate("RootRegion", new Uri("CustomerDetails",   
                                                         UriKind.Relative));
   }

CustomerViewModel.cs

private IEnumerable<Project> projects;
private Project project;
private Customer customer;
SampleDomainContext _context;
public IEnumerable<Project> Projects
{
    get { return projects; }
    set
    {
        projects = value;
        if (projects != null)
        {
            Project = projects.FirstOrDefault();
            OnPropertyChanged("Project");
        }
    }
}
public Customer Customer
{
    get
    {
        return customer;
    }
    set
    {
        customer = value;
    }
}

public Project Project
{
    get
    {

        return project;
    }
    set
    {
        project = value;
        OnPropertyChanged("Project");
        if (project != null)
        {
            Customer = project.CustomerProjects.FirstOrDefault().Customer;
            OnPropertyChanged("Customer");
        }
    }
}
  public CustomerViewModel()
    {

       int s =Common.ActiveData.Instance.userid;
       if(s!=0)
       {
         UserName = Common.ActiveData.Instance.UserName;
         OnPropertyChanged("UserName");
         GetProjectList(Common.ActiveData.Instance.userid);

       }
    }

    public void GetProjectList(int userid)
    {
        _context = new PartsDomainContext();
       _context.Load(_context.GetProjectListQuery(ActiveData.Instance.userid), Param =>
        {
            if (!Param.HasError)
            {

                Projects = Param.Entities;
                OnPropertyChanged("Projects");

            }
        }, null);
    }

私の CustomerDetailsview ページには、以下のコントロールがあります。

テキストブロック テキストブロック テキストブロック

【保存ボタン】 【キャンセルボタン】

ListBox選択した値を TextBlocksにバインドする必要があります。

4

1 に答える 1

2

複数のビューモデルにバインドするデータを次のような新しいクラスに抽出します。

public class CustomerCommonDataViewModel : INotifyPropertyChanged
{
    public Project SelectedProject {get; set;} // Implement it notifying the change.
}

このシングルトンの両方のビューモデル (Customer と CustomerDetails) に通知プロパティを追加し、同じ CustomerCommonDataViewModel インスタンスを両方に渡します。

public class CustomerViewModel : INotifyPropertyChanged
{
    public CustomerCommonDataViewModel CommonData {get; set;} // Implement it notifying the change.
}

public class CustomerDetailsViewModel : INotifyPropertyChanged
{
    public CustomerCommonDataViewModel CommonData {get; set;} // Implement it notifying the change.
}

xaml で、バインディングをこの新しいプロパティに変更します。

{Binding CommonData.Projects}
{Binding CommoData.SelectedProject}
于 2013-01-08T12:45:35.347 に答える