3

タイプ検証の良いコード例を見つけました:

public class StringViewModel : ViewModelBase, IComparable
{
    private string _value;
    private string _originalValue;

    public StringViewModel(string value)
    {
        _value = value;
        _originalValue = value;
    }

    // Der eigentliche Wert.
    public string Value
    {
        get { return _value; }
        set
        {
            if (value != _value)
            {
                _value = value;
                RaisePropertyChanged("Value");
                HasChanges = _value != _originalValue && !(string.IsNullOrEmpty(_value) && string.IsNullOrEmpty(_originalValue));
            }
        }
    }

    public override void AcceptChanges()
    {
        _originalValue = _value;
        HasChanges = false;
        HasError = false;
    }

    public override void UndoChanges()
    {
        Value = _originalValue;
        HasError = false;
    }

    // Muss implementiert werden, damit die Sortierung im CollectionView funktioniert.
    public int CompareTo(object obj)
    {
        if (obj == null) return 1;
        if (object.ReferenceEquals(this, obj)) return 0;
        StringViewModel other = obj as StringViewModel;
        return string.Compare(this._value, other._value);
    }

    public override string ToString()
    {
        return _value;
    }
}

今、私はそれをより一般的にしたいので、実行時に以下の2つの値を作成する必要があります。

private T? _value;
private T? _originalValue;

私は次のようなことをしたいので:

public class ItemModel : IComparable, INotifyEXTEND
{
    private ??? _value;
    private ??? _originalValue;

    public ItemModel(string value)
    {
            _value = value;
            _originalValue = value;
    }

    public ??? Value
    {
        get { return _value; }
        set
        {
            if (value != _value)
            {
                _value = value;
                RaisePropertyChanged("Value");
                HasChanges = _value != _originalValue && !(string.IsNullOrEmpty(_value) && string.IsNullOrEmpty(_originalValue));
            }
        }
    }

    public override void AcceptChanges()
    {
        _originalValue = _value;
        HasChanges = false;
        HasError = false;
    }

    public override void UndoChanges()
    {
        Value = _originalValue;
        HasError = false;
    }

    public int CompareTo(object obj)
    {
        if (obj == null) return 1;
        if (object.ReferenceEquals(this, obj)) return 0;
        ??? other = obj as ???;
        return string.Compare(this._value, other._value);
    }

    public override string ToString()
    {
        return _value;
    }
}

だから私はそれを次のように使うことができます:

public class PersonViewModel : ViewModelBase
{

    private Person _person;
    private ItemModel _lastname;
    private ItemModel _birthdate;
    private bool _isNew;

    // Otherstuff
}

これを行う方法について何か提案はありますか?(いくつかのサンプルコードスニペットまたはリンクがいいでしょう)

4

2 に答える 2

4

ジェネリックを使用する必要があります:

public class ItemModel<T> : IComparable<ItemModel<T>>, INotifyEXTEND where T : IComparable<T>
于 2012-10-29T15:38:47.257 に答える
1

SLaks啓発のヒントの後の私の解決策(それをありがとう)私はそれが誰かを助けることを願っています

public class ValueModel<T> : IComparable
{
    private object _value;
    private object _originalValue;

    public T Value
    {
        get { return (T)_value; }
        set
        {
            if ((object)value != _value)
            {
                _value = value;
            }
        }
    }

    public ValueModel(T value)
    {
        _value = value;
        _originalValue = value;
    }

    public void AcceptChanges()
    {
        _originalValue = _value;
    }

    public void UndoChanges()
    {
        Value = (T)_originalValue;
    }

    // Muss implementiert werden, damit die Sortierung im CollectionView funktioniert.
    public int CompareTo(object obj)
    {
        if (obj == null) return 1;
        if (object.ReferenceEquals(this, obj)) return 0;
        ValueModel<T> other = obj as ValueModel<T>;
        if (typeof(T) == typeof(String))
            return string.Compare(this._value.ToString(), other._value.ToString());
        else
            return ((IComparable)_value).CompareTo(other._value);
    }
}

次のように使用できます

public ValueModel<int> Id {get;set;}

次のようなメソッドを実行します

Id.AcceptChanges();

それにバインドします

TextBox Text="{Binding Id.Value}"
于 2012-10-30T14:58:19.587 に答える