2015-06-24 119 views
3

我正在尋找現成的使用實現共同的問題 - 獲取有關類似屬性的信息:已經改變,初始值等C#EditableValue <T>實施

我敢肯定,我看到了這樣的事情已經完成,但我找不到它。

我想是這樣的:

public EditableValue<string> Name; 

,然後使用:

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

你知道這方面的任何解決方案?

我正在創建基於WPF和MVVM的項目。

+0

什麼是準備使用實施?這裏的人會試圖即興你的代碼.. – Muds

+0

指向你,但...這只是重新發明輪兩次。 – Tomasz

+0

它不是,它學習輪子如何工作,然後使用它.. – Muds

回答

0

我曾經有過類似的需求,並寫了一個類,它看起來像這樣:

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); 
    } 
} 

注意,它使用BindableBase從Prism.Mvvm nuget package實施INotifyPropertyChanged

只需鍵入DisplayValue即可更改UI中的值,並通過單擊保存(或放棄)可設置Value(或重置DisplayValue)。 只要沒有設置_displayValue的實際值就會通過。 如果您只對實際值感興趣而沒有未完成的更改,則還可以綁定到Value

+0

這是我現在有的解決方案。爲什麼你的T只能是結構體? – Tomasz

+0

T必須是struct(它包含任何值類型),因爲我使用_displayValue的可爲空的字段,這對於這種引用類型是不可能的。這可以改善,但我只是用類值的類。 – MatthiasG

0

我建議你嘗試在EditableValue類中嘗試執行INotifyPropertyChanged,然後聽聽屬性更改的事件。

如果您嘗試分享您的代碼,然後我們可能會解決您可能遇到的任何問題。