2011-09-22 84 views
0

我使用textName爲用戶輸入他的名字。然後鍵入,textchanged事件更新與輸入相匹配的名稱的列表框,然後用戶可以點擊一個項目(列表框中的CompletedName),當它發生時,我需要與項目內容的文本框更新..此問題開始當我更改了「CompletedName」的「GivenName」(作爲來自表I的字段的字段)..(它是來自查詢的字符串concat,如上所見)綁定文本框到列表框twoway onewaytosource的問題?

我有這個LINQ查詢:

var players = 
        from p in context.Player 
        where (p.GivenName.StartsWith(TextName.Text.Trim()) || p.Number.StartsWith(TextName.Text) || p.Surname.StartsWith(TextName.Text)) 
        select new { CompleteName = p.GivenName + " " + p.Surname + " (" + p.Number + ")"}; 

然後我使這個源列表框名爲listNames和我有這個文本框:

<TextBox Name="TextName" Text="{Binding ElementName=listNames, Path=SelectedItem.CompleteName}"/> 

當運行它,示出下一個錯誤: 「一個雙向或OneWayToSource結合不能在只讀屬性類型爲‘CompleteName’‘<> f__AnonymousType0`1 [System.String]’工作」

我明白,當然不能是TwoWay或OneWayToSource。但我需要用戶可以將內容添加到textName,因爲它也是一個搜索文本框,而不更新列表框上的SelectedItem。

如果我添加到文本框的表達Mode = OneWay ..在textName控件中沒有任何反應,我的意思是它沒有顯示列表框中的項目.. 我應該怎麼做讓它工作?

+0

的OnlyRead源可以顯示更多的XAML –

回答

0

我會回答我自己的答案,問題。正如我不能使它與工作模式=單向我這樣做:

public class CompleteNamesResuls 
    { 
     public String CompleteName { get; set; } 
    } 
    private void TextName_TextChanged(object sender, TextChangedEventArgs e) 
    { 
       var players = 
        from p in context.Player 
        where (p.GivenName.StartsWith(TextName.Text.Trim()) || p.Number.StartsWith(TextName.Text) || p.Surname.StartsWith(TextName.Text)) 
        select new CompleteNamesResuls(){ CompleteName = p.GivenName + " " + p.Surname + " (" + p.Number + ")" }; 

    } 

這樣的,而不是使用Anonimous類型時的

0

您綁定到匿名類型的實例,但匿名類型的屬性是隻讀的,因此綁定無法更新CompleteName屬性。

無論如何,從我的理解,你不是試圖更新名稱,TextBox實際上是一個搜索框。在這種情況下,您使用的方法無法工作。您需要處理TextBoxTextChanged事件(如果您使用的是MVVM,則將其綁定到ViewModel的屬性),然後使用新值在ListBox中選擇適當的項目。所以無論如何,你將無法使用匿名類型來做到這一點,因爲它的屬性將無法在執行搜索的方法中訪問......

+0

的我使用textName爲用戶輸入他的名字。然後鍵入,textchanged事件更新與輸入相匹配的名稱的列表框,然後用戶可以點擊一個項目,當它發生時,我需要與項目內容的文本框更新..它開始發生時,我改變了「GivenName」(作爲我查詢的表中的字段)「CompletedName」 – Max