2017-10-16 14 views
1

他のリンクをここで確認しましたが、本当に正しい答えを得ることはできません。私は2つのテキストボックスで構成されるxamlを持っています。最初は時間で、次は分です。テキストボックスで時間の値を変更すると、分は0にリセットされます。OnPropertyChangeでどうすればいいですか?OnPropertyChangedがトリガーされたときに他のプロパティを更新します

public class Variable : INotifyPropertyChanged 
{ 
    public Variable() 
    { 
     this.hours = "1"; 
     this.minutes = "2"; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private string hours; 
    private string minutes; 

    public string Hours 
    { 
     get { return this.hours.ToString(); } 
     set 
     { 
      if (this.hours != value) 
      { 
       this.hours = value; 
       this.minutes = "0"; 
       this.OnPropertyChanged("Hours"); 
      } 
     } 
    } 

    public string Minutes { get { return this.minutes; } } 

    public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+1

doを0に設定した後、this.OnPropertyChanged( "Minutes") 'を実行します。 – Evk

答えて

3

Minutesテキストボックスは読み取り専用でない限り、あなたはそのプロパティのセッターを持っている必要があります。

public string Minutes 
{ 
    get => this.minutes; 
    set 
    { 
     if (this.minutes != value) 
     { 
      this.minutes = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

今、あなたは、変更のUIを通知するHoursセッターでこのセッターを使用することができます。

if (this.hours != value) 
{ 
    this.hours = value; 
    this.OnPropertyChanged(); 
    this.Minutes = "0"; 
} 

代わりにMinutesが読み取り専用のプロパティである場合は、2つのオプションがあります。セッターを作成しますprivate上記のように、それをE)または手動変更のUIを通知するOnPropertyChanged()を呼び出します。それは、不要な複雑さを追加するため

if (this.hours != value) 
{ 
    this.hours = value; 
    this.OnPropertyChanged(); 

    this.minutes = "0"; 
    this.OnPropertyChanged(nameof(Minutes)); 
} 

は、私は強く目のオプションに対するよ、私は絶対に必要な場合を除き、手動で変更を通知する必要はありません。


これらのすべては、コード内でさらにいくつか改善する可能性があると述べています。

OnPropertyChanged()には[CallerMemberName]という属性のパラメータがあります(プロパティ内から呼び出された場合は、プロパティ名を指定する必要はありません)。 (2番目の例を参照)、"PropertyName"の代わりにnameof(PropertyName)を使用する必要があるときは、プロパティの名前を変更すると自動的に変更されるためです。

私はあなたのコードの大きな絵を持っていませんが、HoursMinutesが整数財産であるならば、あなたはintの代わりstringを持っている必要があります。入力が間違っている場合は、できるだけ早くユーザーに知らせることをお勧めします。また、あなたが検証する必要があります値:

if (value < 0 || value >= 60) 
    throw new ArgumentOutOfRangeException(...); 
この場合

ないが、一般的に、あなたがバッキングフィールドは、あなたがセッターを持っていないという理由だけであり性質を持っているとき、あなたが使用することができます。

public string Minutes { get; private set; } 
2

単に名前Minutes

OnPropertyChanged(nameof(Minutes)); 

で再びOnPropertyChanged呼び出しを呼び出すか、あなたがそれを呼び出す分の宿泊施設にプライベートセッターを追加することができます。 だからあなたはこのようなものがあります:ところで

public class Variable : INotifyPropertyChanged 
{ 
    public Variable() 
    { 
     this.hours = "1"; 
     this.minutes = "2"; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private string hours; 
    private string minutes; 

    public string Hours 
    { 
     get { return this.hours.ToString(); } 
     set 
     { 
      if (this.hours != value) 
      { 
       this.hours = value; 
       this.OnPropertyChanged(); 

       this.Minutes = "0";      
      } 
     } 
    } 

    public string Minutes 
    { 
     get { return this.minutes; } 
     private set 
     { 
      if(this.minutes == value) 
       return; 

      this.minutes = value; 
      OnPropertyChanged() 
     } 
    } 

    public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

を、呼び出し中[CallerMemberName]属性を使用すると、パラメータに任意の値を渡さない場合は、それを呼ばれる誰の名前を取るだろうことを意味し。プロパティの場合、それはそのプロパティの名前になるので、それを書く必要はありません。

関連する問題