Путь привязки WPF =/ не работает?

Я настроил свой 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

В ответ на вопрос ОП о том, почему {Binding} работает, но {Binding Path=/} не работает, я добавляю следующую информацию в качестве ответа, чтобы прояснить разницу.

Следующее взято из Обзор привязки данных MSDN > Привязка к коллекциям :

Указатели текущих элементов

Представления также поддерживают понятие текущего элемента. Вы можете перемещаться по объектам в представлении коллекции. Во время навигации вы перемещаете указатель элемента, который позволяет вам получить объект, который существует в этом конкретном месте в коллекции. Пример см. в разделе Как перемещаться по объектам в Data CollectionView.

Поскольку WPF привязывается к коллекции только с помощью представления (либо указанного вами представления, либо представления коллекции по умолчанию), все привязки к коллекциям имеют текущий указатель элемента. При привязке к представлению символ косой черты ("/") в значении пути обозначает текущий элемент представления. В следующем примере контекст данных представляет собой представление коллекции. Первая строка привязывается к коллекции. Вторая строка привязывается к текущему элементу в коллекции. Третья строка привязывается к свойству 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

В качестве альтернативы ответу Данко я обнаружил Static Resources! (я нуб WPF)

<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