我正在使用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行是唯一相关的。
感谢您的帮助。
答案 0 :(得分:2)
您必须在包含该属性的类上实施INotifyPropertyChanged
(MSDN 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));
}
}