OneWayToSource
綁定似乎打破了.NET 4.0OneWayToSource綁定似乎打破了.NET 4.0
我有這個簡單的一塊XAML中
<StackPanel>
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>
<Button/>
</StackPanel>
和我後面的代碼看起來像這樣
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private string m_textProperty;
public string TextProperty
{
get
{
return "Should not be used in OneWayToSource Binding";
}
set
{
m_textProperty = value;
}
}
在.NET 3.5中這可以像你可能除外。放入TextBox
一些文本,按Tab鍵使其失去焦點,而TextProperty
更新與任何文本是在TextBox
進入在.NET 4.0,如果我鍵入TextBox
一些文字,然後按選項卡使它失去焦點,TextBox
恢復爲TextProperty
(意思是「不應用於OneWayToSource綁定」)的值。這是否重新閱讀了.NET 4.0中的OneWayToSource
Binding?我只是想TextBox
將其價值推到TextProperty
而不是相反。
更新
加入懸賞這個問題,因爲這已經成爲我的項目市長不便,我想知道,這種情況已經改變的原因。看起來,綁定已更新源後調用get
。這是在.NET 4.0中綁定的OneWayToSource
所需的行爲嗎?
如果是
- 知道是怎麼在3.5的工作方式的問題?
- 這種新行爲在哪些情況下更好?
或者是這樣,其實我們可以希望錯誤得到固定在未來的版本?
我的猜測是爲了反映您在設置過程中可能應用的任何過濾,以便TextBox的內容實際上反映了「真正」設置的值。然後,OneWayToSource唯一不同的地方是它只會在應用set()之後調用get(),而不是在發送屬性更改通知時調用get()。 – 2011-02-02 15:46:40
在一個側面說明中,一個以這種方式行爲的屬性(它暴露了一個getter,但get與設置的內容完全無關)是一個相當的病態屬性。這聽起來像你真正想要的是一個方法,但是打包爲一個屬性以允許綁定系統觸發該呼叫。這可能是值得研究創建一個自定義行爲,因爲這樣你就不必濫用財產製度。 – 2011-02-02 15:51:28
@丹·布萊恩特:你在評論戴維的回答還是你在回答這個問題? :)我應該補充說,如果你刪除了getter,那麼每當`LostFocus`被引發時,`TextBox`都會一直是空白的。當然,這不可能是「OneWayToSource」綁定的理想方式,或者您認爲如何? – 2011-02-02 17:04:29