绑定背景颜色的WPF初始化但不更新

时间:2016-01-07 09:09:09

标签: c# wpf xaml

我正在使用observable collection和dataTemplates来创建通用面板,当我的按钮颜色(以编程方式设置)初始化时,我遇到了一个问题,但是一旦运行颜色保持不变,就会发生变化。

这是按钮的Xaml代码:

<Button Grid.Column="0" Grid.Row="3" Background="{Binding Path=motionColor}" Command="{Binding Path=MotionPress}" Content="Motion" Height="51" Width="104" Style="{StaticResource MyButtonStyle}"/>

那是我的DataTemplate:

<DataTemplate x:Key="GenericPanelTemplate"  DataType="local:GenericPanel">

这里是GenericPanel.cs中的相关后端代码:

motionColor:

public Brush motionColor { get; set; }

该功能最终按钮执行(测试并运行):

public void MotionButton_Click()
        {
                motionColor = setColor((byte)Value.ON);
        }
    private Brush setColor(byte value)
    {
        switch (value)
        {
            case (byte)Value.OFF:
                return Brushes.Red;
            case (byte)Value.ON:
                return Brushes.Green;
            case (byte)Value.PROGRESS:
                return Brushes.Yellow;
            default:
                return Brushes.Gray;
        }
    }

一开始,motionColor设置为红色,按钮确实显示为红色,但是当此值更改为Brushes.Green时,它不再起作用(调试证明值正确更改)。

如何使按钮检查其绑定值并更新背景属性?

如果需要更多代码请问,我认为这些函数和Xaml行是唯一相关的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您必须在包含该属性的类上实施INotifyPropertyChangedMSDN link),并通知您对该属性的更改。

类似的东西:

public GenericPanel : INotifyPropertyChanged
{
  private Brush _motionColor;
  public Brush motionColor { 
    get { return _motionColor; }; 
    set { 
      _motionColor = value; 
      OnPropertyChanged(); 
    }
  }

  /* ... the rest of your class ... */

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

这一切都可以使用Fody(具体为the PropertyChanged add-in)自动完成,但如果您只需要此特定属性,则使用Fody可能会出现问题

更新

由于OP,根据评论,似乎使用旧版本的.NET和C#,这里是“更兼容”的版本:

public GenericPanel : INotifyPropertyChanged
{
  private Brush _motionColor;
  public Brush motionColor { 
    get { return _motionColor; }; 
    set { 
      _motionColor = value; 
      OnPropertyChanged("motionColor"); 
    }
  }

  /* ... the rest of your class ... */

  public event PropertyChangedEventHandler PropertyChanged;
  protected void OnPropertyChanged(string propertyName)  
  {
    var handle = PropertyChanged;
    if(handle != null) 
      handle(this, new PropertyChangedEventArgs(propertyName));
  }
}