C# EditableValue<T> 实现

标签 c# wpf mvvm

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

我很确定我已经看到类似的东西,但我找不到它。

我在想这样的事情:

public EditableValue<string> Name;

然后是用法:

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

你知道解决这个问题的方法吗?

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

最佳答案

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

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 package 中的 BindableBase实现 INotifyPropertyChanged

仅绑定(bind)到 DisplayValue 使您能够在 UI 中更改值,通过单击保存(或丢弃)您可以设置 Value(或重置 DisplayValue )。 只要没有为 _displayValue 设置任何内容,就会传递实际值。 如果您只对没有显着变化的实际值感兴趣,您也可以绑定(bind)到 Value

关于C# EditableValue<T> 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31025220/

相关文章:

c# - 使用 WCF 服务从 ASP.NET 应用程序进行串行端口通信

c# - WPF(C#) 如何使用post请求传输文件?

wpf - MVP 和 MVVM 之间的区别

c# - 在 DataGrid 上设置 DataContext

c# - 如何计算 MVVMCross Xamarin.iOS 中的应用程序空闲时间?

c# - 检查应用程序是否在模拟器上运行

c# - 解析器错误消息 : Could not create type 'xxx'

wpf - 所有 WPF 控件都可聚焦吗?

.net - 如何反转 BooleanToVisibilityConverter?

c# - 如何绑定(bind)到 WPF 应用程序中的 subview 模型属性?