Привязка текстового поля к списку двух проблем с одним источником? - PullRequest
0 голосов
/ 22 сентября 2011

Я использую textName для пользователя, чтобы ввести его имя. Затем, набрав, событие textaged обновляет список с именами, совпадающими с входными данными, затем пользователь может щелкнуть элемент (CompletedName в списке), и когда это происходит, мне нужно обновить текстовое поле с содержимым элемента. Эта проблема началась произойдет, когда я изменил «GivenName» (как поле из таблицы, к которой я запрашиваю) для «CompletedName» .. (это строка строки из запроса, как вы видите выше)

У меня есть этот запрос 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 ничего не происходит, я имею в виду, что он не показывает элемент из списка. Что я должен сделать, чтобы это работало ??

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Я отвечу своим собственным ответом для следующих людей с такой же проблемой. Поскольку я не мог заставить его работать с 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 + ")" };

    }

Таким образом, вместо использования Anonimous Type, который был источником OnlyRead

0 голосов
/ 22 сентября 2011

Вы привязываетесь к экземпляру анонимного типа, но свойства анонимных типов доступны только для чтения, поэтому привязка не может обновить свойство CompleteName.

В любом случае, насколько я понимаю, вы не пытаетесь обновить имя, TextBox на самом деле является окном поиска.В этом случае подход, который вы используете, не может работать.Вам нужно обработать TextChanged событие TextBox (или связать его со свойством вашей ViewModel, если вы используете MVVM) и использовать новое значение, чтобы выбрать соответствующий элемент в ListBox.Так что в любом случае вы не сможете сделать это с анонимным типом, так как его свойства не будут доступны в методе, который выполняет поиск ...

...