"{Binding Path =.}" И "{Binding}" действительно равны - PullRequest
44 голосов
/ 30 марта 2011

В моем проекте WPF у меня есть ListBox, который отображает элементы из коллекции List<string>. Я хотел сделать текст этих элементов редактируемым, поэтому я обернул каждый из них в ItemTemplate с помощью TextBox (возможно, это не лучший способ, но я новичок в WPF). У меня возникли проблемы, просто привязав свойство TextBoxes к значению каждого элемента. Я наконец наткнулся на пример, использующий одну точку или точку для свойства Path ({Binding Path=.}):

<ListBox ItemsSource="{Binding ElementName=recipesListbox,Path=SelectedItem.Steps}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=.}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Однако я не понимаю, почему простое использование {Binding} не сработало.

Возникло исключение " Двухстороннее связывание требует Path или XPath ", как в соответствии с Microsoft :

[...] путь точки (.) Может использоваться для привязки к текущему источнику. Например, Text = "{Binding}" эквивалентно Text = "{Binding Path =.}"

Может ли кто-нибудь пролить свет на это неоднозначное поведение?

РЕДАКТИРОВАТЬ: Более того, кажется, {Binding Path=.} не обязательно дает двустороннюю привязку, так как изменение текста и перемещение фокуса не обновляет базовый источник (тот же источник имеет также отображаемые свойства и успешно изменен в элементе управления DataGrid). Я определенно что-то здесь упускаю.

Ответы [ 4 ]

27 голосов
/ 04 августа 2012

Смысл исключения, по-видимому, заключается в том, что вы не можете двусторонне связать сам источник привязки, поэтому он пытается помешать вам создать привязку, которая не ведет себя так, как вы бы этого хотели.Используя {Binding Path=.}, вы просто обманываете обработку ошибок.

(Также не случайно, что документация ошибочна или неточна, хотя мне очень нравится документация MSDN в целом, поскольку она обычно содержитважные моменты, которые интересуют)

20 голосов
/ 30 марта 2011

В документации указано, что {Binding} эквивалентно {Binding Path=.}. Однако не эквивалентно {Binding Path}, как вы ввели. Если вы включаете свойство Path, вы должны присвоить его чему-либо, будь то Path=. или Path=OtherProperty.

7 голосов
/ 14 июля 2011

Это не одно и то же.Если вы связываете это, когда ConsoleMessages является строкой ObservableCollection с просто {Binding}, вы получите «Двустороннее связывание требует Path или XPath».исключение где {Binding Path =.} работает.Это с WPF 4.0 ...

    <ItemsControl x:Name="ConsoleOutput" ItemsSource="{Binding ConsoleMessages, Mode=OneWay}" MaxHeight="400">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Path=.}" BorderThickness="0" Margin="0" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Мой 2р стоит ...

4 голосов
/ 06 марта 2015

Короче говоря, разница между ними аналогична разнице между традиционной передачей по значению и передачей по ссылке.(БЮР - В чем разница между передачей по ссылке и передачей по значению? )

Однако я не понимаю, почему простое использование {Binding} не сработало (этоподнял исключение «Для двусторонней привязки требуется путь или XPath»)

Давайте пока предположим, что {Binding} может использоваться для двусторонней привязки.В общем случае {Binding} создает ссылку на основе значений с datacontext, которая не позволяет обновлять текст данных.

Принимая во внимание, что {Binding Path=.} создает ссылку на основе ссылки с областью памяти, на которую ссылается «Путь», что позволяет обновлять значение черезссылка. (в данном случае 'точка' текущий текст данных).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...