【问题标题】:WPF Nullable<T> and class bindingWPF Nullable<T> 和类绑定
【发布时间】:2012-09-17 16:45:57
【问题描述】:

我的模型中有一个 int?string 属性,这是无法更改的(例如,我无法将此属性拆分为两个单独的属性对)。

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

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

【问题讨论】:

  • 当你说“值”时,你的意思是“int”的值?场地?还是字符串字段的值?明确这两个领域之间的关系。还是您的意思是模型中的每个字段都需要自己的复选框和文本框对?
  • 没有关系,只需要 Nullable 和类的解决方案。我的意思是字符串没有要绑定的 HasValue 属性,比如 int?确实如此,所以我需要两种情况的解决方案。
  • 所以基本上,int?应该是 1/null 取决于复选框 IsChecked 并且字符串应该是文本框的值,但前提是复选框被选中?

标签: wpf data-binding binding wpf-4.0


【解决方案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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2011-08-16
      • 2017-04-01
      相关资源
      最近更新 更多