0

我使用 textName 为用户输入他的名字。然后键入,textchanged 事件使用与输入匹配的名称更新列表框,然后用户可以单击一个项目(列表框中的 CompletedName),当它发生时,我需要使用项目内容更新文本框。这个问题开始了当我为“CompletedName”更改“GivenName”(作为我查询的表中的一个字段)时发生。(它是来自查询的字符串连接,如您在上面看到的)

我有这个 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}"/>

当我运行它时,显示下一个错误:“A Two Way or OneWayToSource binding cannot work on the read-only property 'CompleteName' of type '<>f__AnonymousType0`1[System.String]'”

我理解,它当然不能是 TwoWay 或 OneWayToSource。但我需要用户可以向 textName 添加内容,因为它也是一个搜索文本框,无需更新列表框上的 SelectedItem。

如果我在文本框中添加表达式 Mode=OneWay.. textName 控件中没有任何反应,我的意思是它不会显示列表框中的项目.. 我应该怎么做才能让它工作?

4

2 回答 2

0

您正在绑定到匿名类型的实例,但匿名类型的属性是只读的,因此绑定无法更新该CompleteName属性。

无论如何,据我了解,您并没有尝试更新名称, TextBox 实际上是一个搜索框。在这种情况下,您使用的方法不起作用。您需要处理 的TextChanged事件TextBox(如果您使用 MVVM,则将其绑定到 ViewModel 的属性),并使用新值在ListBox. 因此,无论如何,您将无法使用匿名类型执行此操作,因为在执行搜索的方法中无法访问其属性...

于 2011-09-22T14:49:43.800 回答
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 来源的匿名类型

于 2011-09-24T11:17:48.663 回答