绑定文本框到列表框twoway onewaytosource问题?

时间:2011-09-22 14:30:48

标签: wpf binding textbox listbox two-way-binding

我使用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控件中没有任何反应,我的意思是它不会显示列表框中的项目.. 我该怎么办才能让它发挥作用?

2 个答案:

答案 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类型