0

我有一个int?和我的模型中的字符串属性,并且无法更改(例如,我无法将此属性拆分为两个单独的属性对)。

我想将这些属性绑定到 Checkbox 和 TextBox。因此,如果 CheckBox 未选中,则值应为null,如果 CheckBox 已选中,则值应为输入到 TextBox 中的任何内容。

用 WPF 实现这一点的正确方法是什么?我使用.Net Framework 4.5。

4

2 回答 2

1

在这种情况下,您可能希望将 ViewModel 包装在 Model 类周围,而不是将其直接绑定到视图。

在这种情况下,您将拥有类似“MyDataViewModel”的东西,它会公开一个字符串属性和一个布尔属性。当绑定更改这些属性时,它将使用每个字段的适当值更新基础模型类。

直接绑定到您的模型类通常仅在您的模型类支持丰富的绑定功能(例如数据注释)以及您使用数据服务类来处理保存和加载这些对象时完成。

于 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 的​​基本实现,您可以从基类或 mvvm 库(例如 Caliburn.Micro MMVMLite 或 ReactiveUI)继承。

有关视图模型或 MVVM 的更多信息,请查看MDSN 的 MVVM 上的 Josh Smith

于 2012-09-17T17:50:11.640 回答