2017-06-29 73 views
-1

我正在製作一個小應用程序,它是一個從數據源讀取的表單,我想用它來編輯和添加新記錄。 所以表單中文本框的默認綁定模式是TwoWay模式,所以用戶可以編輯現有記錄,但是我想添加一個複選框,當它被選中時,它將文本框中的數據標記爲新的,然後添加它們到數據源,所以我需要將綁定模式更改爲OneWay, 就我所知,要在代碼中執行此操作,我需要創建一個新的Binding對象,我將不得不設置不會更改的屬性,如Source更改代碼中的綁定模式?

Binding myBinding = new Binding(); 
myBinding.Source = ViewModel; 
myBinding.Path = new PropertyPath("SomeString"); 
myBinding.Mode = BindingMode.TwoWay; 
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 

那麼有沒有辦法只改變代碼中的綁定模式?

EDIT

本申請的一些進一步的解釋:

在形式有綁定到一個List<Book>組合框,有3個TextBox S,其Text屬性綁定到的DataContext對象它們的容器本身設置爲ComboboxSelectedItem。 當我按照答案中所述添加ReadOnly屬性時,當選中該複選框時,我無法更改文本框中的文本。

..

謝謝!

+0

你是對的,你需要創建新的綁定。但。你能解釋爲什麼你想在代碼隱藏方面做到這一點?您可以在觸發器中設置XAML中的新綁定,查看複選框「IsChecked」的值。另外我確定你不需要改變'Mode'的綁定。讓它成爲'TwoWay',但當綁定到'IsChecked'的某個屬性等於true時,不更新後備字段。 – Maxim

+0

有趣,你可以請它張貼作爲答案,代碼示例? –

+0

好的,我發佈了它。 – Maxim

回答

-1

答案是「是,但是」。 Binding的Mode屬性有一個setter。所以似乎可以設置像這樣一個現有的綁定的模式...

 BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty); 
     Binding b = be?.ParentBinding as Binding; 
     if (b != null) 
     { 
      b.Mode = BindingMode.OneWay; 
     } 

但是,如果你這樣做,你會在任何情況下得到異常...

System.InvalidOperationException occurred 
HResult=0x80131509 
Message=Binding cannot be changed after it has been used. 

所以只有這樣才能實現你想要的是在改變模式的同時基於舊的綁定創建新的綁定。然後替換舊的綁定。

  BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty); 
     Binding b = be?.ParentBinding as Binding; 
     if (b != null) 
     { 
      Binding b2 = new Binding(); 
      b2.Path = b.Path; 
      b2.Mode = BindingMode.OneWay; 
      textBox.SetBinding(TextBox.TextProperty, b2); 
     } 

這是不理想的,因爲完整性你需要複製的轉換器,轉換器參數等,但是這是你能做的最好的。

1

不要更改綁定的Mode。只要糾正你的視圖模型邏輯。

public class ViewModel : INotifyPropertyChanged 
{ 
    private string _text; 
    private bool _readOnly; 

    public string Text 
    { 
     get { return _text; } 
     set 
     { 
      if (ReadOnly || value == _text) 
       return; 

      _text = value; 
      OnPropertyChanged(nameof(Text)); 
     } 
    } 

    public string ReadOnly 
    { 
     get { return _readOnly; } 
     set 
     { 
      if (value == _readOnly) 
       return; 

      _readOnly = value; 
      OnPropertyChanged(nameof(ReadOnly)); 
     } 
    } 
} 

在XAML中綁定你的CheckBoxReadOnly財產IsChecked財產。

+0

它不會更新UI,但仍然綁定到源 –

+0

是的。它有什麼問題?它可以在不改變綁定的情況下解決您的任務。如果這個解決方案不恰當的描述原因。 – Maxim

+0

我改變了這個setter,'if(title == value)return; title = value; if(ReadOnly)return; OnPropertyChanged(nameof(Title));' 請參閱修改後的問題 –

相關問題