【问题标题】:Property Changed not firing UWP属性更改不触发 UWP
【发布时间】:2021-09-18 18:27:09
【问题描述】:

我正在尝试在属性对象更改时使用 FluentValidation 验证该对象。

private Empresa empresa { get; set; }

    public Empresa Empresa{
        get { return empresa; }
        set { 
            if (empresa == value) return;
            empresa = value;
            RaisePropertyChanged("Empresa");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    
    private void RaisePropertyChanged(string empresa)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Empresa"));
    }
    
    private void EmpresaViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        CompanyValidator validator = new();
        this.ValidationResult = validator.Validate(empresa);
    }

但是当 XAML 中的属性更改时,该集合不会触发

  <TextBox Header="Nome Simplificado" 
                         MinWidth="200" 
                         HorizontalAlignment="Left"
                         LostFocus="TextBox_LostFocus"
                         TextChanging="TextBox_TextChanging"
                         Text="{Binding Empresa.SimplifiedName, Mode=TwoWay, 
                                 UpdateSourceTrigger=Default}"
                         />

有谁知道如何让它工作? (Ps。当我实例化该类的新对象时,事件会触发)。

【问题讨论】:

  • 您遗漏了重要的代码。你注册/附加EmpresaViewModel_PropertyChanged了吗?
  • 什么是SimplifiedName?
  • @JeroenvanLangen,对于第一个问题,是的,我只是没有发布那部分代码,以免使其太大而无法阅读。 SimplifiedName 是 Empresa 类/模型中的属性
  • 属性变更注册可能会注册在Empresa对象上,而不是模型上。
  • 目前还不清楚您要在这里完成什么,但由于您绑定到SimplifiedName,您可能想要处理此属性的PropertyChanged 事件。在TextBox 中输入内容时不会设置Empresa。

标签: c# xaml uwp binding


【解决方案1】:

属性更改未触发 UWP

问题是Text属性绑定路径是Empresa的属性,而不是Empresa本身,你只是为Empresa实例实现RaisePropertyChanged,所以它只在第一次创建Empresa时有效.

如果你想更新Text,你还需要实现SimplifiedName属性。

public class Empresa:INotifyPropertyChanged
{
    private string _simplifiedName;
    public string SimplifiedName
    {
        get { return _simplifiedName; }
        set
        {
            if (_simplifiedName != value)
            {
                _simplifiedName = value;
                RaisePropertyChanged("SimplifiedName");
            }
            
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

更新文本

private void MyButton_Click(object sender, RoutedEventArgs e)
{
    Empresa.SimplifiedName = "New Value";

}

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 2021-10-04
    • 2021-01-27
    • 2017-09-14
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多