none
view model generico passandogli un entita con una relazione uno a molti RRS feed

  • Discussione generale

  • Ciao a tutti, avrei il bisogno (non so se è fattibile) crearmi un viemodelgenerico,(per una sola entita ci riesco) il problema nasce quando devo pasare a questo viewmodel un entita con una relazione uno a molti.

    OBBIETTIVO: ho  una finestra, con un combbox  dei textbox e una grid. dal combobox scelgo un tipo documento (tutti i documenti avranno le stesse proprieta esempio DocumentoA,DocumentoB,DocumentoC)  quando nella mia finestra premo Salva in base alla scelta del combobox mi salva nella determinata tabella.

    PROBLEMA:Io ho pensato di intercettare l'evento del cambiamento del mio combobox e quando seleziono cambio anche il datacontext della mia finestra utilizzando questo viewmodelgenerico ma non riesco ad accedere al corpo della mia entita

    Cerco di spiegamri melgio con un po di codice:

    La mia finestra(manca la datagrid xo ho simulato il tutto nle mio viewmodelgenerico vedi sotto):

    <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>
    </Window>

    Il codebheind della mia finestra:

    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;
                }
            }
        }
    }

    Le mie entita:

      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; }
        }

    Il mio viewmodel generico:

     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();
                }
    //Non so come accedere al corpo della mia entita
              /*  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();
                }
            }
        }


    • Modificato brux88 venerdì 16 maggio 2014 11:35
    venerdì 16 maggio 2014 11:34