2017-08-23 15 views
-1

2つのintプロパティに2つのラベルがバインドされています。私はまた、他の2つのラベルの合計にバインドされた3番目のラベルを持っています。最後に、値が0でない場合、フォアグラウンドカラーを変更するためにコンバーターを3番目のラベルにフックします。プロパティへのバインド合計

私はこれを間違ってバインドしています。私のコンバータは、私がそれを必要とするときに起動していないようです。私が現在行っていることの簡略化されたバージョンについては、完全なコードを参照してください。

C#の

class IVM : INotifyPropertyChanged 
{ 
    private int _lbl1Int; 
    public int lbl1Int 
    { 
     get { return _lbl1Int; } 
     set 
     { 
      _lbl1Int = value; 
      NotifyPropertyChanged(value); 
     } 
    } 

    private int _lbl2Int; 
    public int lbl2Int 
    { 
     get { return _lbl2Int; } 
     set 
     { 
      _lbl2Int = value; 
      NotifyPropertyChanged(value); 
     } 
    } 

    private int _lblOverallInt; 
    public string ErrorsWarningsHeader 
    { 
     get { return "Errors/Warnings: " + _lblOverallInt; } 
     set{} 
    } 
    public int lblOverallInt 
    { 
     get { return _lblOverallInt; } 
     set 
     { 
      _lblOverallInt = value; 
      NotifyPropertyChanged(nameof(ErrorsWarningsHeader)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void NotifyPropertyChanged(int newValue, [CallerMemberName] String propertyName = "") 
    { 
     var handler = PropertyChanged; 
     lblOverallInt += newValue; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class IsZeroConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((int)value == 0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new InvalidOperationException("IsZeroConverter can only be used OneWay."); 
    } 
} 

XAML

<StackPanel> 
    <Label Name="lbl1" Content="{Binding Path=ErrorsWarningsHeader, UpdateSourceTrigger=PropertyChanged}"> 
     <Label.Resources> 
      <local:IsZeroConverter x:Key="isZeroConverter"/> 
     </Label.Resources> 
     <Label.Style> 
      <Style TargetType="Label"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=lblOverallInt}" Value="0"> 
         <Setter Property="Foreground" Value="Yellow"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=lblOverallInt, Converter={StaticResource isZeroConverter}}" Value="False"> 
         <Setter Property="Foreground" Value="Red"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Label.Style> 
    </Label> 
    <Label Name="lbl2" Content="{Binding Path=lbl1Int, UpdateSourceTrigger=PropertyChanged}"></Label> 
    <Label Name="lbl3" Content="{Binding Path=lbl2Int, UpdateSourceTrigger=PropertyChanged}"></Label> 
    <Button Click="Button_Click">Go</Button> 
</StackPanel> 

ボタン

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ivm.lbl2Int += 1; 
    ivm.lbl1Int += 1; 
} 

答えて

0

あなたはConvertメソッドが呼び出さ取得するためlblOverallIntプロパティのPropertyChangedイベントを発生させる必要があります。

あなたの現在の実装はあまり意味がありません。 lblOverallIntは、他の2つのプロパティの合計を返す読み取り専用プロパティである必要があります。これを試してください:

class IVM : INotifyPropertyChanged 
{ 
    private int _lbl1Int; 
    public int lbl1Int 
    { 
     get { return _lbl1Int; } 
     set 
     { 
      _lbl1Int = value; 
      NotifyPropertyChanged(); 
      NotifyPropertyChanged("lblOverallInt"); 
      NotifyPropertyChanged("ErrorsWarningsHeader"); 
     } 
    } 

    private int _lbl2Int; 
    public int lbl2Int 
    { 
     get { return _lbl2Int; } 
     set 
     { 
      _lbl2Int = value; 
      NotifyPropertyChanged(); 
      NotifyPropertyChanged("lblOverallInt"); 
      NotifyPropertyChanged("ErrorsWarningsHeader"); 
     } 
    } 

    public string ErrorsWarningsHeader 
    { 
     get { return "Errors/Warnings: " + lblOverallInt; } 
    } 
    public int lblOverallInt 
    { 
     get { return _lbl1Int + _lbl2Int; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     var handler = PropertyChanged; 
     if (PropertyChanged != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
0

これは間違った使い方

NotifyPropertyChanged(value); 

変更されたプロパティの名前を渡す必要があります(lblOverallIntセッターなど)。

NotifyPropertyChanged(nameof(lbl1Int)); 
+0

しかし、私は2つのNotifyPropertyChangedメソッドを区別するためにこれを行います。私は全体の値が変更されたときに私の全体的な値に追加したくないので、 'lblOverallInt + = newValue;'ではない別のNotifyPropertyChangedメソッドを持たなければなりませんでした。 – windowskm

関連する問題