2012-09-17 53 views
0

我有一個int?字符串屬性在我的模型中,這是不能改變的(我不能將這個屬性分成兩個單獨的屬性對)。WPF可爲空<T>和類綁定

我想將這些屬性綁定到複選框和文本框。所以如果CheckBox沒有被選中,值應該是null,如果CheckBox被選中的值應該是輸入到TextBox中的任何值。

什麼是正確的方式來實現這與WPF?我使用.Net Framework 4.5。

+0

當你說「值」,你指的是價值「的詮釋?」領域?或者字符串字段的值?澄清這兩個領域之間的關係。或者你的意思是你的模型中的每個字段都需要自己的複選框和文本框對? –

+0

沒有關係,只需要爲Nullable 和類的解決方案。我的意思是字符串沒有HasValue屬性來綁定,像int?這樣做,所以我需要兩種情況下的解決方案。 – adontz

+0

所以基本上,int?應該是1/null,取決於複選框IsChecked,並且該字符串應該是文本框的值,但僅當該複選框被選中時纔是? – Rich

回答

1

對不起,我首先完全錯誤地讀了這個問題。

假設你有一個像這樣

class FakeModel 
{ 
    public int? IntegerValue { get; set; } 
    public string StringValue { get; set; } 
} 

那麼最好的方法模型來解決,這是實現一個視圖模型如

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

1

在這種情況下,您可能希望將ViewModel包裝在Model類的周圍,而不是直接將其綁定到視圖。

在這種情況下,你會有類似「MyDataViewModel」的東西,它會暴露一個字符串屬性和一個布爾屬性。當這些屬性被綁定改變時,它會用每個字段的適當值更新基礎模型類。

直接綁定到您的模型類通常只在您的模型類支持豐富的綁定功能(如數據註釋)以及使用數據服務類來處理保存和加載這些對象時完成。