元素在第一次点击时不改变属性
本文关键字:改变 属性 第一次 元素 | 更新日期: 2023-09-27 18:11:39
我想这是一个非常基本的问题,但是为什么WPF在第二次点击时不改变属性(例如背景)而不是第一次点击?我使用ViewModel来存储来自UI的值。因此,当用户单击Save按钮时,我可以轻松访问它们。
ViewModel包含几个属性,这里只是一个摘录:
using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using Drawing = System.Drawing;
using Media = System.Windows.Media;
using BarcodeLib;
namespace BarcodeEncoder
{
class BarcodeViewModel : INotifyPropertyChanged
{
// Some more properties
private Media.Brush foreColor;
public Media.Brush ForeColor
{
get { return this.foreColor; }
set
{
if (this.foreColor != value)
this.OnPropertyChanged("ForeColor");
this.foreColor = value;
}
}
private Media.Brush backColor;
public Media.Brush BackColor
{
get { return this.backColor; }
set
{
if (this.backColor != value)
this.OnPropertyChanged("BackColor");
this.backColor = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public BarcodeViewModel()
{
// Initialisation of the other properties
this.ForeColor = new Media.SolidColorBrush(Media.Colors.Black);
this.BackColor = new Media.SolidColorBrush(Media.Colors.White);
}
}
}
这里是相关的XAML标记:
<StackPanel
x:Name="rootElement"
Orientation="Horizontal"
Height="Auto" Width="Auto">
<StackPanel.DataContext>
<local:BarcodeViewModel />
</StackPanel.DataContext>
<!-- Some more UI elements -->
<StackPanel
x:Name="pForeColor"
Background="{Binding ForeColor}"
Width="Auto" Height="23"
Margin="5,0,5,0"
MouseDown="pForeColor_MouseDown"/>
</StackPanel>
最后但并非最不重要的MouseDown事件处理程序:
private void pForeColor_MouseDown(object sender, MouseButtonEventArgs e)
{
using (var cd = new Forms.ColorDialog())
{
if (cd.ShowDialog() == Forms.DialogResult.OK)
this.bcvm.ForeColor = new Media.SolidColorBrush()
{
Color = Media.Color.FromArgb(cd.Color.A, cd.Color.R, cd.Color.G, cd.Color.B)
};
}
}
因此,如果我尝试设置StackPanel pForeColor
的颜色,ColorDialog打开,但当单击OK时,面板不改变颜色。只有当再次执行此操作并提交选择时,才会显示之前选择的颜色。
谁能告诉我这里出了什么问题?
Ok…得到它!
错误在于,在设置新颜色之前调用OnPropertyChanged
方法(这样也调用PropertyChanged
事件)。
检查一下,如果设置了新值,那么设置新值然后引发事件