WPF Binding Path=/ не работи?

Настроих моя DataContext така:

<Window.DataContext>
    <c:DownloadManager />
</Window.DataContext>

Където DownloadManager е Enumerable<DownloadItem>. След това зададох своя DataGrid така:

<DataGrid Name="dataGrid1" ItemsSource="{Binding Path=/}" ...

Така че трябва да изброява всички DownloadItems, нали? Така че трябва да мога да настроя колоните си като:

<DataGridTextColumn Binding="{Binding Path=Uri, Mode=OneWay}"

Където Uri е свойство на DownloadItem. Но изглежда не харесва това. Във визуалния редактор на свойства той не разпознава Uri като валидно свойство, така че предполагам, че правя нещо нередно.

Работеше и преди, когато имах мрежата с данни, обвързваща към Values, но след това извадих това изброимо от DownloadManager и го направих изброимо. Как да поправя това?

PS: Под „не работи“ имам предвид, че не изброява никакви елементи. Добавих някои към конструктора на DM, така че не трябва да е празен.


person mpen    schedule 06.05.2010    source източник
comment
Path=/ се опитва да намери свойство на DownloadManager, наречено / - това никога няма да е правилно. (Ако беше XmlDataSource, бихте могли да използвате XPath=/, но това е съвсем различна история...)   -  person Dan Puzey    schedule 07.05.2010
comment
@Dan: А.. Току-що избрах Текущ елемент от редактора на свойства и това ми даде.   -  person mpen    schedule 07.05.2010
comment
@Dan - Path=/ ще се свърже с текущия елемент в DataContext (когато DataContext е колекция). Ето един добър ресурс, който използвам доста често, когато се позовавам на пътища за свързване: nbdtech.com/Blog/archive/2009/02/02/   -  person Metro Smurf    schedule 07.05.2010
comment
@Metro: Тогава защо {Binding} работи, но {Binding Path=/} не работи?   -  person mpen    schedule 07.05.2010
comment
вижте моя отговор, който предоставих като допълнение.   -  person Metro Smurf    schedule 07.05.2010


Отговори (3)


Опитайте ItemsSource="{Binding}". Трябва да е достатъчно.

person Danko Durbić    schedule 06.05.2010
comment
Брилянтно! Работи като чар. - person mpen; 07.05.2010
comment
Или ItemsSource="{Binding Path=.}". И двамата вършат една и съща работа. - person Amsakanna; 07.05.2010

В отговор на въпроса на OP защо {Binding} работи, но {Binding Path=/} не работи, добавям следната информация като отговор, за да изясня разликата.

Следното е взето от MSDN Data Binding Overview > Binding to Collections :

Текущи указатели на елементи

Изгледите също поддържат идеята за текущ елемент. Можете да навигирате през обектите в изглед на колекция. Докато навигирате, вие премествате указател на елемент, който ви позволява да извлечете обекта, който съществува на това конкретно място в колекцията. За пример вижте Как да: Навигирате през обектите в Data CollectionView.

Тъй като WPF се свързва с колекция само чрез използване на изглед (или изглед, който сте посочили, или изглед по подразбиране на колекцията), всички обвързвания към колекции имат указател на текущия елемент. При обвързване към изглед, наклонената черта ("/") в стойността на Path обозначава текущия елемент на изгледа. В следващия пример контекстът на данните е изглед на колекция. Първият ред се свързва с колекцията. Вторият ред се свързва с текущия елемент в колекцията. Третият ред се свързва със свойството Description на текущия елемент в колекцията.

<Button Content="{Binding }" />
<Button Content="{Binding Path=/}" />
<Button Content="{Binding Path=/Description}" />
person Metro Smurf    schedule 06.05.2010
comment
Оооо..... добре. Сега вече разбрах. Текущ елемент != DataContext. Това е първият елемент в DataContext. - person mpen; 07.05.2010

Като алтернатива на отговора на Данко, открих статични ресурси! (Аз съм WPF noob)

<Window x:Class="ImageGetGUI.MainWindow"
    ...
    <Window.Resources>
        <c:DownloadManager x:Key="dm"/>
    </Window.Resources>
    ...
    <DataGrid Name="dataGrid1" ItemsSource="{StaticResource dm}" ...
person mpen    schedule 06.05.2010
comment
Можете също така да наименувате вашия Window.DataContext, т.е. <Window.DataContext> <c:DownloadManager x:Name="dm" /> </Window.DataContext> Това ще ви позволи да получите достъп до DataContext по име във вашия код отзад, ако е необходимо. Може също да искате да разгледате ObjectDataProvider; Намерих ги за изключително полезни, когато се поставят в речника на ресурсите на приложението. Например, когато имате колекция, която се използва повторно в множество изгледи, т.е. List<US States>. - person Metro Smurf; 07.05.2010