0

私はintを持っていますか?モデルの文字列プロパティとこれを変更することはできません(たとえば、このプロパティを2つの別々のプロパティのペアに分割することはできません)。

これらのプロパティをCheckboxとTextBoxにバインドしたいと思います。したがって、CheckBoxがチェックされていない場合、値はnullである必要があり、CheckBoxがチェックされている場合、値はTextBoxに入力されたものである必要があります。

WPFでこれを実装する正しい方法は何ですか?.NetFramework4.5を使用しています。

4

2 に答える 2

1

この場合、ViewModelをビューに直接バインドするのではなく、Modelクラスの周りにラップすることをお勧めします。

この場合、「MyDataViewModel」のようなものがあり、stringプロパティとboolプロパティが公開されます。これらのプロパティがバインディングによって変更されると、基になるモデルクラスが各フィールドの適切な値で更新されます。

モデルクラスへの直接バインドは、通常、モデルクラスがデータアノテーションなどの豊富なバインド機能をサポートしている場合、およびデータサービスクラスを使用してこれらのオブジェクトの保存と読み込みを処理する場合にのみ行われます。

于 2012-09-17T17:45:49.283 に答える
1

申し訳ありませんが、最初はこの質問を完全に間違って読みました。

あなたがこのようなモデルを持っていると仮定します

class FakeModel
{
    public int? IntegerValue { get; set; }
    public string StringValue { get; set; }
}

次に、これを解決する最良の方法は、次のようなViewModelを実装することです。

    class FakeViewModel : INotifyPropertyChanged
    {
    private  FakeModel _fakeModel;

    public FakeViewModel(FakeModel  model)
    {
        _fakeModel = model;
    }
    public bool IntChecked
    {
        get { return _fakeModel.IntegerValue.HasValue; }
        set
        {
            if (value)
                IntegerValue = -1; //for example
            else
                IntegerValue = null; //to reset
            OnPropertyChanged("IntChecked");
        }
    }

    public int IntegerValue
    {
        get { return _fakeModel.IntegerValue.Value; }
        set { _fakeModel.IntegerValue.Value = value;
        OnPropertyChanged("IntegerValue");
        }
    }

    public bool StringChecked
    {
        get { return _fakeModel.StringValue.HasValue; }
        set
        {
            if (value)
                StringValue = -1; //for example
            else
                StringValue = null; //to reset
            OnPropertyChanged("StringChecked");
        }
    }

    public int StringValue
    {
        get { return _fakeModel.StringValue.Value; }
        set
        {
            _fakeModel.StringValue.Value = value;
            OnPropertyChanged("StringValue");
        }
    }

    protected void OnPropertyChanged(string callerName)
    {
        var temp = PropertyChanged;
        if (temp != null)
            temp(this, new PropertyChangedEventArgs(callerName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

これには、INotifyPropertyChangedの基本的な実装が含まれます。これは、Caliburn.MicroMMVMLiteやReactiveUIなどの基本クラスまたはmvvmライブラリから交互に継承できます。

ビューモデルまたはMVVMの詳細については、MDSNのMVVMに関するJoshSmithを確認してください。

于 2012-09-17T17:50:11.640 に答える