WPF Nullable <t>和类绑定</t>

时间:2012-09-17 16:45:58

标签: wpf data-binding binding wpf-4.0

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

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

使用WPF实现此功能的正确方法是什么?我使用.Net Framework 4.5。

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,你会有类似“MyDataViewModel”的东西,它会暴露一个字符串属性和一个bool属性。当绑定更改这些属性时,它将使用每个字段的相应值更新基础模型类。

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

答案 1 :(得分: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的更多信息,请查看Josh Smith on MVVM from MDSN