元素在第一次点击时不改变属性

本文关键字:改变 属性 第一次 元素 | 更新日期: 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事件)。

检查一下,如果设置了新值,那么设置新值然后引发事件