【问题标题】:UIElement does not change property on first ClickUIElement 在第一次单击时不会更改属性
【发布时间】:2016-10-05 08:47:57
【问题描述】:

我想这是一个非常基本的问题,但是为什么 WPF 在第二次而不是在第一次单击时不更改属性(例如背景)?我使用 ViewModel 来存储我的 UI 中的值。因此,当用户单击“保存”按钮时,我可以轻松访问它们。

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 会打开,但单击“确定”时面板不会改变颜色。只有当再次执行此操作并提交选择时,才会出现之前选择的颜色。

那么有人可以告诉我这里出了什么问题吗?

【问题讨论】:

  • 请不要在标题中强行添加标签。标签部分确保它们将被正确索引并被其他用户识别

标签: c# wpf mvvm properties


【解决方案1】:

好的……知道了!

错误是,在设置新颜色之前调用了 OnPropertyChanged 方法(这样也调用了 PropertyChanged 事件)。

只需检查,如果设置了新值,则设置新值,然后引发事件

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多