我使用textName为用户输入他的名字。然后键入,textchanged事件使用与输入匹配的名称更新列表框,然后用户可以单击项目(列表框中的CompletedName),当它发生时我需要文本框更新与项目内容..此问题已启动当我更改“GivenName”(作为我查询的表中的一个字段)为“CompletedName”时发生..(它是查询中的字符串concat,如上所示)
我有这个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绑定不能对类型为'&lt;&gt; f__AnonymousType0`1 [System.String]'的只读属性'CompleteName'起作用'”
我理解,当然它不能是TwoWay或OneWayToSource。但我需要用户可以向textName添加内容,因为它也是一个搜索文本框,而不更新列表框上的SelectedItem。
如果我在文本框中添加表达式Mode = OneWay .. textName控件中没有任何反应,我的意思是它不会显示列表框中的项目.. 我该怎么办才能让它发挥作用?
答案 0 :(得分:0)
您绑定到匿名类型的实例,但匿名类型的属性是只读的,因此绑定无法更新CompleteName
属性。
无论如何,根据我的理解,你不是要更新名称,TextBox实际上是一个搜索框。在这种情况下,您使用的方法无法工作。您需要处理TextChanged
的{{1}}事件(如果您正在使用MVVM,则将其绑定到ViewModel的属性),并使用新值在{{{{}}中选择相应的项目。 1}}。所以无论如何你将无法使用匿名类型执行此操作,因为在执行搜索的方法中无法访问其属性...
答案 1 :(得分:0)
我将回答我自己的答案,为下一个有同样问题的人提供答案。由于我无法使用Mode = OneWay,我这样做了:
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 + ")" };
}
这样,而不是使用作为
的OnlyRead源的Anonimous类型