我有一个int?和我的模型中的字符串属性,并且无法更改(例如,我无法将此属性拆分为两个单独的属性对)。
我想将这些属性绑定到 Checkbox 和 TextBox。因此,如果 CheckBox 未选中,则值应为null,如果 CheckBox 已选中,则值应为输入到 TextBox 中的任何内容。
用 WPF 实现这一点的正确方法是什么?我使用.Net Framework 4.5。
我有一个int?和我的模型中的字符串属性,并且无法更改(例如,我无法将此属性拆分为两个单独的属性对)。
我想将这些属性绑定到 Checkbox 和 TextBox。因此,如果 CheckBox 未选中,则值应为null,如果 CheckBox 已选中,则值应为输入到 TextBox 中的任何内容。
用 WPF 实现这一点的正确方法是什么?我使用.Net Framework 4.5。
在这种情况下,您可能希望将 ViewModel 包装在 Model 类周围,而不是将其直接绑定到视图。
在这种情况下,您将拥有类似“MyDataViewModel”的东西,它会公开一个字符串属性和一个布尔属性。当绑定更改这些属性时,它将使用每个字段的适当值更新基础模型类。
直接绑定到您的模型类通常仅在您的模型类支持丰富的绑定功能(例如数据注释)以及您使用数据服务类来处理保存和加载这些对象时完成。
对不起,我一开始完全错误地阅读了这个问题。
假设您有这样的模型
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