Привязка текстового поля к списку. Проблемы с двухсторонним источником?

Я использую textName, чтобы пользователь мог ввести свое имя. Затем при вводе текстовое событие обновляет список с именами, которые совпадают с вводом, затем пользователь может щелкнуть элемент (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 не может работать с доступным только для чтения свойством 'CompleteName' типа '‹> f__AnonymousType0`1 [System.String]' »

Я понимаю, конечно, что это не может быть TwoWay или OneWayToSource. Но мне нужно, чтобы пользователь мог добавлять контент в textName, потому что это также текстовое поле поиска, без обновления SelectedItem в списке.

Если я добавлю в текстовое поле выражение Mode = OneWay .. в элементе управления textName ничего не происходит, я имею в виду, что он не отображает элемент из списка .. Что мне делать, чтобы он работал ??


person Max    schedule 22.09.2011    source источник
comment
Можете ли вы показать больше XAML   -  person Dean Chalk    schedule 22.09.2011


Ответы (2)


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

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

person Thomas Levesque    schedule 22.09.2011
comment
Я использую textName, чтобы пользователь мог ввести свое имя. Затем при вводе текстовое событие обновляет список с именами, которые совпадают с вводом, затем пользователь может щелкнуть элемент, и когда это произойдет, мне понадобятся обновления текстового поля с содержимым элемента. Это начало происходить, когда я изменил GivenName (как поле из таблицы, которую я запрашиваю) для CompletedName - person Max; 22.09.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 + ")" };

    }

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

person Max    schedule 24.09.2011