2017-10-01 4 views
0

Ich suche nach einem Weg ist, in meinem ViewModel einchecken, wenn eine bestimmte Registerkarte ausgewählt ist und einige Abfragen ausführen. Hier ist mein Szenario:Abfragen nur ausführen, wenn die Registerkarte ausgewählt ist WPF MVVM

Ich habe 2 Tabs - Tab1 enthält ein Datenraster mit einigen Code-hinten und Tab2 nur einige Textfelder gebunden an mein ViewModel. Beide Registerkarten teilen sich einen Datapicker. Wenn ich eine Zeile aus dem Datagrid in Tab1 auswähle, ändert sich das Datum, wodurch eine Menge von Abfragen ausgelöst wird, die an die Textfelder in Tab2 gebunden sind, da alle Abfragen den ausgewählten Monat als Parameter verwenden.

Dies gibt es wirklich ineffektiv und die DataGrid-Zeilenauswahl wird sehr langsam. Wie kann ich das vermeiden? Was ist die einfachste Möglichkeit, mein ViewModel so einzurichten, dass es prüft, ob Tab2 ausgewählt ist und erst dann die Abfragen ausführen? Ich dachte daran, den selectedIndex im TabControl zu binden, aber ich konnte es nicht zum Laufen bringen. Ich bin ziemlich neu in diesem Bereich und würde mich über Hilfe freuen.

Ansichtsmodell

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Location.Model; 
using System.Windows.Controls; 

namespace Location.ViewModel 
{ 
    public class LocationViewModel: INotifyPropertyChanged 
    { 
     public LocationViewModel() 
     { 
      SetEfficiency(); 
     } 

     private DateTime _mDate = DateTime.Now; 

     public DateTime MDate 
     { 
      get { return _mDate; } 
      set 
      { 
       _mDate = value; 
       OnPropertyChanged("MDate"); 
       SetEfficiency(); 
      } 
     } 

     decimal efficiency; 

     public decimal Efficiency 
     { 
      get { return efficiency; } 
      set 
      { 
       efficiency = value; 
       OnPropertyChanged("Efficiency"); 
      } 
     } 

     DailyEntities db = new DailyEntities(); 

     private void SetEfficiency() 
     { 
      var month; 
      int.TryParse(MDate.ToString("MM"), out month); 
      Efficiency = Convert.ToDecimal(db.LocationKPI.Where(a => a.sMonth == month).Select(a => a.Efficiency).FirstOrDefault()); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName = null) 
     { 
      if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

MainWindow.xaml.cs

public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new LocationViewModel(); 

     string connectionString = "datasource=xx.xx.xxx.xxx;port=xxx;username=xxxxx;password=xxxxx"; 
     string sMonth = DateTime.Now.ToString("MM"); 
     string sYear = DateTime.Now.ToString("yyyy"); 

     MySqlConnection connection = new MySqlConnection(connectionString); 

     MySqlCommand cmd = new MySqlCommand("Select * from MyTable where MONTH(Date) = @sMonth AND YEAR(Date) = @sYear", connection); 

     try 
     { 
      connection.Open(); 
      cmd.Parameters.Add(new MySqlParameter("sMonth", sMonth)); 
      cmd.Parameters.Add(new MySqlParameter("sYear", sYear)); 

      DataTable dt = new DataTable(); 
      dt.Load(cmd.ExecuteReader()); 
      dtGrid.DataContext = dt; 
      connection.Close(); 

     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 



    } 

    private void vDatePick_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 

      string connectionString = "datasource=xx.xx.xxx.xxx;port=xxx;username=xxxxx;password=xxxxx"; 
      string sMonth = DateTime.Parse(vDatePick.Text).ToString("MM"); 
      string sYear = DateTime.Parse(vDatePick.Text).ToString("yyyy"); 
      string vDate = DateTime.Parse(vDatePick.Text).ToString("yyyy-MM-dd"); 

      MySqlConnection connection = new MySqlConnection(connectionString); 
      MySqlCommand cmd = new MySqlCommand("Select * from MyTable where MONTH(Date) = @sMonth AND YEAR(Date) = @sYear", connection); 


      try 
      { 

       connection.Open(); 
       cmd.Parameters.Add(new MySqlParameter("sMonth", sMonth)); 
       cmd.Parameters.Add(new MySqlParameter("sYear", sYear)); 
       DataTable dt = new DataTable(); 
       dt.Load(cmd.ExecuteReader()); 
       connection.Close(); 
       dtGrid.DataContext = dt; 

      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

    } 


    private void dtGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 

     DataRowView row_selected = dtGrid.SelectedItem as DataRowView; 
     if (row_selected == null) return; 
     vDatePick.Text = row_selected["Date"].ToString(); 
     txtHours.Text = row_selected["Hours"].ToString(); 

    } 

Danke

Antwort

1
  • Fügen Sie Ihre TabControl diese SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}
  • Ihre Methode ändern wie unten:

    private void vDatePick_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 
        if(SelectedTabIndex == 1) 
        { 
        //... your code 
        } 
    } 
    
+0

Hallo Karamba. Ich habe es auf Ihre Art und Weise versucht und bekomme folgenden Fehler: "Der Name existiert im aktuellen Kontext nicht." Sollte es eine if-Anweisung in meinem ViewModel geben? – iCosmin

+0

Hallo @iCosmin. Ihre Klassen .xaml und .cs sollten denselben Namespace haben. Da sie teilweise sind. '' Und Sie müssen hinzufügen 'public int SelectedTabIndex {get; einstellen; } 'Eigenschaft für Ihre MainWindow Klasse. – karamba61

Verwandte Themen