2017-09-30 1 views
0

MVVMを使い始めてINotifyPropertyChangedを実装することができました。次の問題に直面しています。私のdatepickerの月をクエリに渡しても、私が別の月を選択すると、私のクエリは変わらない。twoWayバインディングがdatepickerで動作しないMVVM

私はINotifyPropertyChangedがそれを処理することを望んでいました。 datepickerとは別の月を選択するときに効率性がどのように変化するか確認するにはどうすればよいですか?

はあなたに

のViewModel

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() 
     { 
      var month = 0; 
      int.TryParse(MDate.ToString("MM"), out month); 
      var db = new DailyEntities(); 
      Efficiency = Convert.ToDecimal(db.LocationKPI.Where(a => a.sMonth == month).Select(a => a.Efficiency).FirstOrDefault()); 
     } 

     private DateTime _mDate = DateTime.Now; 

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

     decimal efficiency; 

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


     public event PropertyChangedEventHandler PropertyChanged; 

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

ビュー

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new LocationViewModel(); 
    } 
} 

XAML

ありがとうございました210
+1

あなたはMVVMアプリの背後にあるコードがありますか? 'SelectedDateChanged =" vDatePick_SelectedDateChanged "' –

+0

あなたは正しいです、それは本当に悪い習慣です。私はMVVMに移行し始めましたが、残念です。 – iCosmin

答えて

1

なぜなら、ViewModelでは、コードを実行してコンストラクタの効率を設定しているに過ぎないからです。あなたは、メソッドを作成する必要があり、その後、コンストラクタとMDateのセットからそれを呼び出すため、効率性は、各時間MDateの変更が更新されます。

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)); 
     } 
    } 
} 
+0

DSway、あなたに帽子をかける!これはまさに私が探していたものです。完全で、簡単で分かりやすい例です。あなたは私の週末を救いました。私はあなたに寒い人を借りています。どうもありがとうございます!あなたは男です! – iCosmin

+0

うれしかった! – DSway

1

あなたはMDate

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

ときEfficiencyは私もゲッターにEfficiencyのクエリを入れて、セッターを削除します更新しなければならないという状態を必要としています。これは、プライベート変数efficiencyが不要になり、コンストラクタ内のクエリを削除することを意味します。

public decimal Efficiency 
{ 
    get 
    { 
     var month = 0; 
     int.TryParse(MDate.ToString("MM"), out month); 
     return Convert.ToDecimal(
      db.LocationKPI 
       .Where(a => a.sMonth == month) 
       .Select(a => a.Efficiency) 
       .FirstOrDefault()); 
    } 
} 

EDITは:Efficiencyゲッターとセッター

EDITを更新:あなたは、ページのロード時に結果を確認したい場合は、おそらく同様にあなたのコンストラクタでデフォルト値にMDateを設定する必要があります注意したいと思いました。

+0

ありがとうDavid!新人として、私はあなたの事例から多くを学んだ。本当にありがとうございます。素晴らしい週末を過ごしましょう! – iCosmin

関連する問題