我的模型中有 int?和字符串属性,但这不能更改(例如,我无法将此属性拆分为两个单独属性的对)。
我想将这些属性绑定到Checkbox和TextBox。因此,如果未选中CheckBox,则值应为 null ,如果选中CheckBox,则值应为输入TextBox的值。
使用WPF实现此功能的正确方法是什么?我使用.Net Framework 4.5。
答案 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