2014-05-16 71 views
0

我必须创建一个传递具有一对多关系的实体的通用视图模型。 我会解释: 我的Windows:如何创建通用视图模型

<Window x:Class="Invoice_Example_Brux.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:invoiceExampleBrux="clr-namespace:Invoice_Example_Brux" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <invoiceExampleBrux:MainWindowViewModel/> 
</Window.DataContext> 
<Grid> 
    <TextBox HorizontalAlignment="Left" Height="23" Margin="174,78,0,0" TextWrapping="Wrap" Text="{Binding MyModel.Name}" VerticalAlignment="Top" Width="120"/> 
    <Label Content="Id" HorizontalAlignment="Left" Margin="10,53,0,0" VerticalAlignment="Top"/> 
    <TextBox HorizontalAlignment="Left" Height="23" Margin="10,78,0,0" TextWrapping="Wrap" Text="{Binding MyModel.Id}" VerticalAlignment="Top" Width="120" IsReadOnly="True"/> 
    <Label Content="Number" HorizontalAlignment="Left" Margin="322,52,0,0" VerticalAlignment="Top"/> 
    <TextBox HorizontalAlignment="Left" Height="23" Margin="322,78,0,0" TextWrapping="Wrap" Text="{Binding MyModel.Number}" VerticalAlignment="Top" Width="120"/> 
    <Label Content="Name" HorizontalAlignment="Left" Margin="174,53,0,0" VerticalAlignment="Top"/> 
    <Button Content="Save" HorizontalAlignment="Left" Margin="211,288,0,0" VerticalAlignment="Top" Width="75" Command="{Binding SaveCommand}"/> 
    <ComboBox 
     SelectionChanged="Selector_OnSelectionChanged" 
       HorizontalAlignment="Left" Margin="180,38,0,0" VerticalAlignment="Top" Width="120"     
       DisplayMemberPath="Name" 
       ItemsSource="{Binding DocumentType,UpdateSourceTrigger=PropertyChanged}"/> 
    <Label Content="Type Document" HorizontalAlignment="Left" Margin="192,12,0,0" VerticalAlignment="Top"/> 
</Grid> 

myWindows codebheind:

namespace Invoice_Example_Brux 
{ 

    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      var cmb = sender as ComboBox; 
      var selectedItem = cmb.SelectedValue as DocumentType; 
      if (selectedItem == null) return; 
      var code = selectedItem.Code; 
      switch (code) 
      { 
       case "A": 
        DataContext = new ViewModelGeneric<DocumentA>(); 
        break; 
       case "B": 
        DataContext = new ViewModelGeneric<DocumentB>(); 
      break; 
       case "C": 
        break; 
      } 
     } 
    } 
} 

我的实体文献展和DocumentB:

public class DocumentA : DocumentGeneral 
    { 
     public ObservableCollection<DetailDocumentA> DetailDocumentA { get; set; } 

    } 
    public class DetailDocumentA : DetailDocumentGeneral 
    { 
    } 

    public class DocumentB : DocumentGeneral 
    { 
     public ObservableCollection<DetailDocumentB> DetailDocumentB { get; set; } 

    } 
    public class DetailDocumentB : DetailDocumentGeneral 
    { 
    } 

    public class DocumentGeneral 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 
     public string Number { get; set; } 
     public string TypeDocument { get; set; } 

    } 
    public class DetailDocumentGeneral 
    { 
     public Guid Id { get; set; } 
     public string Quantity { get; set; } 
     public string Price { get; set; } 
     public string Total { get; set; } 
    } 

我ViewModelGeneric:

public class ViewModelGeneric<T> : ViewModelBase 
     where T : DocumentGeneral, new() 
    { 
     public T MyModel { get; set; } 
     public RelayCommand SaveCommand { get; set; } 
     public ViewModelGeneric() 
     { 
      MyModel = new T(); 
      SaveCommand = new RelayCommand(Save); 
     } 

     private void Save(object obj) 
     { 
      if (MyModel.Id == Guid.Empty) 
      { 
       MyModel.Id = Guid.NewGuid(); 
      } 
//the problme is here. how can I do to fill in the detail of my entity 
      /* MyModel.Detail.Add(new DetailDocumentGeneral 
      { 
       Price = "50",Quantity = "100",Total = "5000" 
      });*/ 

      using (var ctx = new DocumentContext()) 
      { 
       var document = ctx.Set<T>(); 
       document.Add(MyModel); 
       ctx.SaveChanges(); 
      } 
     } 
    } 

问题是,根据我的组合框的选择,我必须去一个不同的实体。 但我不能访问各自的detailDocument =(

回答

0

请停止你在做什么...... WPF是一种冗长的语言,这意味着你将不得不写大量的代码,甚至可能复制大型部分。只是帮你一个忙,接受这个事实,我一次又一次地看到了这种情况(甚至在我第一次学习WPF时浪费了我自己的时间),但它总是以眼泪结束。 ,通常为一个视图提供一个视图模型,这个视图模型负责为相关视图提供所有的数据和功能,除非你的所有视图几乎都是相同的,那么你的通用视图模型根本不起作用更糟糕的是,即使它确实有效,也会使地狱变得复杂脱离你的项目,并使简单的任务更加困难。

如果你真的不想每次都重写你的视图模型,那么只需从另一个视图模型中复制和粘贴,并改变它们之间的差异即可。说了这么多,我必须说你的代码似乎对你的话有些奇怪......你说你想要一个通用的视图模型,但是你的问题与数据访问有关。

将您的数据访问类放入单独项目中的视图模型更为常见。在这方面,看起来好像你试图实施The Repository Pattern,但在错误的地方。制作通用数据访问类比通用视图模型更为常见,并且出错率要小得多。

因此,我强烈建议您忘记通用视图模型并为每个视图声明一个新视图模型,然后将您的数据访问代码移动到单独的项目(或至少一个单独的类)中,并可选择使该通用模型(使用MSDN上的链接页面寻求帮助)。这个可能是是你在这个尝试中遇到的第一个真正的问题,但是如果你沿着这条道路继续前行,我可以向你保证它不会是最后一个。

+0

我发布的是一个简化的例子。我有一层存储库,但不是lho inseirto的例子。因为问题如下: 我希望我可以根据组合框的选择决定将表保存在哪里。这些表格在它们之间是相同的。如果我有30个具有相同属性的相同表格,我认为我不应该使用相同的方法创建30个视图模型。 为此我想创建一个,因为最后它只是改变了我的数据库destinaizone表。 – Brux88

相关问题