C#可编辑值<;T>;实施

本文关键字:gt 实施 lt 编辑 | 更新日期: 2023-09-27 17:59:17

我正在寻找常见问题的现成实现,以获取有关属性的信息,如:已更改、初始值等。

我很确定我已经看到了这样的事情,但我找不到。

我在想这样的事情:

public EditableValue<string> Name;

然后使用:

if(Name.HasChanged)
{
    if(string.IsNullOrEmpty(Name.NewValue))
        Name.DiscardChanged();
}

你知道这方面的解决方案吗?

我正在创建基于WPF和MVVM的项目。

C#可编辑值<;T>;实施

我曾经有过类似的需求,并写了一个类,看起来像这样:

public class EditableValue<T> : BindableBase where T : struct
{
    private T _value;
    private T? _displayValue;
    public T Value
    {
        get { return _value; }
        set
        {
            _value = value;
            OnPropertyChanged(() => Value);
        }
    }
    public T DisplayValue
    {
        get { return _displayValue ?? Value; }
        set
        {
            _displayValue = value;
            OnPropertyChanged(() => DisplayValue);
        }
    }
    public bool HasChanges
    {
        get { return _displayValue.HasValue; }
    }
    public void DiscardChanges()
    {
        _displayValue = null;
        OnPropertyChanged(() => DisplayValue);
    }
    public void ApplyChanges()
    {
        Value = DisplayValue;
        OnPropertyChanged(() => DisplayValue);
        OnPropertyChanged(() => Value);
    }
}

注意,它使用Prism.Mvvm nuget包中的BindableBase来实现INotifyPropertyChanged

仅绑定到DisplayValue就可以更改UI中的值,通过单击保存(或放弃)可以设置Value(或重置DisplayValue)。只要没有为_displayValue设置任何内容,就会传递实际值。如果您只对没有未完成更改的实际值感兴趣,也可以绑定到Value

我建议您尝试在EditableValue类中实现INotifyPropertyChanged,然后监听属性更改事件。

如果您尝试共享您的代码,那么我们可能能够解决您可能遇到的任何问题。