2013-07-02 71 views
0

我對C#中綁定的想法有點新。我目前有一個正在使用MVVM的應用程序。說我有,例如,一個列表,像這樣:更新來自控件的數據源

List<string> Items = new List<string>() 
{ 
    "Item1", 
    "Item2", 
    "Item3", 
} 

綁定到這個列表是三個文本框,如下所示:

在XAML:

<TextBox Name="TextBox1" text="{Binding TextSource1 Mode=TwoWay}"> 
<TextBox Name="TextBox2" text="{Binding TextSource2 Mode=TwoWay}"> 
<TextBox Name="TextBox3" text="{Binding TextSource3 Mpde=TwoWay}"> 

並在代碼:

Public string TextSource1 
{ 
    get { return Items[0]; } 
    set { Items[0] = value; } 
} 
Public string TextSource2 
{ 
    get { return Items[1]; } 
    set { Items[1] = value; } 
} 
Public string TextSource3 
{ 
    get { return Items[2]; } 
    set { Items[2] = value; } 
} 

說第一個文本框中顯示的值當前是「Item1」,因爲它在列表中。用戶從此處將其更改爲「Item4」。我將如何更新該列表?如果它被設置爲TwoWay,它會自動更新嗎?

我在代碼中知道,如果我是在列表中更改值,說:

Items[2] = "Item4"; 

我可以通過調用

RaisePropertyChanged("TextSource3"); 

更新文本框但是,這不是太大的幫助我目前。項目以ObserableCollection<String>

變化

+0

對不起,但是什麼問題? – Bolu

+0

@Bolu你讀過整件事情嗎?我問道:「假設第一個文本框中顯示的值當前是」Item1「,就像它在列表中一樣,從這裏用戶將其更改爲」Item4「。我將如何更新該列表?如果它設置爲TwoWay,它會自動更新嗎?「 – DanteTheEgregore

+0

您需要在屬性集中提升您的」RaisePropertyChanged「事件 –

回答

1

有幾件事要注意。首先默認情況下,TextBox不會傳播文本更改,直到失去焦點。如果您選擇不在控件中,或者單擊另一個可以獲得焦點的控件(如其他TextBoxes),則會發生這種情況。

您可以通過在Binding設置UpdateSourceTrigger改變這種行爲,(你也不要需要Mode=TwoWayTextBox,因爲它是默認模式):

<TextBox Name="TextBox1" text="{Binding TextSource1, UpdateSourceTrigger=PropertyChanged}" /> 

第二個是你的屬性需要在他們的籌碼中籌集PropertyChanged賽事。雖然這對單個Binding無法正常工作,但如果您決定將其他控件綁定到同一個屬性,則需要這樣做。

1

更改類型的文本框的結合:

<TextBox Name="TextBox1" text="{Binding Items[0], Mode=TwoWay}"> 
<TextBox Name="TextBox2" text="{Binding Items[1], Mode=TwoWay}"> 
<TextBox Name="TextBox3" text="{Binding Items[2], Mpde=TwoWay}"> 

由於的ObservableCollection的內部通報機制,當你修改它的元素之一,它會通知UI。

+0

我喜歡你的答案,但我正在尋找一種方法來更新UI中的元素,而不是從元素中更新UI的方式 – DanteTheEgregore

+1

絕對可以從TextBox更新ViewModel上的數據,問題是你是否想從UI中獲取額外的邏輯通知使用包含集合索引的單獨屬性的好處是你可以在setter中添加一些邏輯如果綁定ing直接應用於集合,您必須添加一個事件偵聽器。但是,我沒有在你的代碼中看到這種情況。 –

0

說出第一個文本框中的顯示值當前是「Item1」,因爲它在列表中。用戶從此處將其更改爲「Item4」。我將如何更新該列表?如果它被設置爲TwoWay,它會自動更新嗎?

是的,它失去焦點時會自動更新。