DataGrid Binding не работает [дубликат]

Кажется, что стандарты 360video / VR все еще находятся в движении. Эта статья http://labs.dash.umn.edu/etc-lab/detecting-spherical-media-files/ (от апреля 2016 года) предполагает, что проверка свойств EXIF ​​для фото / видео может выявить шаблон в метаданных. Доступны библиотеки для доступа к данным EXIF ​​из файлов, например: https://github.com/exif-js/exif-js . Также существуют библиотеки PHP. Сайт Фила Харви ( http://www.sno.phy.queensu.ca/~phil/exiftool/ ) содержит множество примеров информации и кодирования. Скомпилированные инструменты для WIN, MAC и NIX и библиотеки C ++. Из личного опыта значения EXIF ​​можно читать из файлов JPEG. Я никогда не пробовал обращаться к 360 JPEG, но я понимаю, что фотофайлы, созданные из сферических камер, представляют собой не что иное, как обычные JPEG (хотя изображения выглядят искаженными при просмотре без 360 зрителей). Инструмент EXIF, который написал Фил Харви, показывает поддержку mp4. Вы можете использовать инструмент для анализа 360 видеороликов для поиска различимых шаблонов в метаданных.

91
задан akjoshi 30 August 2012 в 15:43
поделиться

5 ответов

Я искал, как сделать что-то подобное в WPF, и я получил это решение:

<ItemsControl ItemsSource="{Binding MyItems,Mode=OneWay}">
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Vertical" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <RadioButton 
            Content="{Binding}" 
            Command="{Binding Path=DataContext.CustomCommand, 
                        RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType={x:Type ItemsControl}} }"
            CommandParameter="{Binding}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>

Надеюсь, это сработает для кого-то другого. У меня есть контекст данных, который автоматически устанавливается в ItemsControls, и этот контекст данных имеет два свойства: MyItems, который представляет собой коллекцию, и одну команду «CustomCommand». Из-за ItemTemplate используется DataTemplate, DataContext верхних уровней недоступен напрямую. Тогда обходной путь для получения DC родителя использует относительный путь и фильтр по типу ItemsControl.

139
ответ дан akjoshi 20 August 2018 в 11:37
поделиться
  • 1
    У меня есть этот точный код в моем проекте, но он пропускает ViewModels (Finalizer не вызывается, Command binding, похоже, сохраняет DataContext). Можете ли вы проверить, что эта проблема существует и для вас? – Joris Weimar 22 January 2013 в 13:05
  • 2
    @Juve это работает, но возможно ли это сделать, чтобы он срабатывал для всех элементов управления, которые реализуют один и тот же шаблон? Имя уникально, поэтому нам нужен отдельный шаблон для каждого, если только я что-то не вижу. – Chris 3 November 2014 в 18:53
  • 3
    @Juve пренебрегаю моим последним, я получил его, чтобы работать, используя родственные источники с findancestor и поиск по предкову (так все равно, кроме поиска по имени). В моем случае я повторяю использование ItemsControls, каждый из которых реализует шаблон, поэтому мой выглядит следующим образом: Command = & quot; {Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Тип ItemsControl}}, Path = DataContext.OpenDocumentBtnCommand} & quot; – Chris 3 November 2014 в 19:15
140
ответ дан akjoshi 31 October 2018 в 09:29
поделиться

Вы можете использовать RelativeSource, чтобы найти родительский элемент, например:

Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, 
RelativeSource={RelativeSource AncestorType={x:Type local:YourParentElementType}}}"

Подробнее о RelativeSource см. этот вопрос SO .

39
ответ дан Community 20 August 2018 в 11:37
поделиться
  • 1
    Мне пришлось указать Mode=FindAncestor, чтобы он работал, но это работает и намного лучше в сценарии MVVM, потому что он избегает элементов управления именованиями. Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:YourParentElementType}}}" – Aphex 12 August 2011 в 16:37
  • 2
    работают как шарм & lt; 3 и не должны указывать режим, .net 4.6.1 – user2475096 1 December 2017 в 23:00

RelativeSource vs. ElementName

Эти два подхода могут достичь того же результата,

RelativeSrouce

Binding="{Binding Path=DataContext.MyBindingProperty, 
          RelativeSource={RelativeSource AncestorType={x:Type Window}}}"

Этот метод ищет контроль над окном типа (в этом примере) в визуальном дереве, и когда он его находит, вы в основном можете получить доступ к DataContext, используя Path=DataContext..... Плюсы этого метода заключаются в том, что вам не нужно привязываться к имени, и это своего рода динамика, однако изменения, внесенные в ваше визуальное дерево, могут повлиять на этот метод и, возможно, сломать его.

ElementName

Binding="{Binding Path=DataContext.MyBindingProperty, ElementName=MyMainWindow}

Этот метод относится к твердому статическому Name, так что пока ваша область видится, вы в порядке. Вы должны придерживаться своего соглашения об именах, а не для разрыва этого метода, конечно. Подход является простым простым, и все, что вам нужно, это указать Name="..." для вашего окна / UserControl.

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

Как указать источник привязки

Найдите краткое описание каждого из них плюс ссылку на более подробную информацию в таблице внизу стр.

18
ответ дан Mehrad 20 August 2018 в 11:37
поделиться

проблема заключается в том, что DataTemplate не является частью элемента, к которому он применяется.

это означает, что если вы привязываетесь к шаблону, который вы привязываете к тому, что не имеет контекста.

однако, если вы поместили элемент внутри шаблона, тогда, когда этот элемент применяется к родительскому объекту, он получает контекст, и привязка затем работает

, поэтому это не сработает

<DataTemplate >
    <DataTemplate.Resources>
        <CollectionViewSource x:Key="projects" Source="{Binding Projects}" >

, но это отлично работает

<DataTemplate >
    <GroupBox Header="Projects">
        <GroupBox.Resources>
            <CollectionViewSource x:Key="projects" Source="{Binding Projects}" >

, поскольку после применения набора данных групповой пакет помещается в родительский элемент и будет иметь доступ к его Контексту

, поэтому все, что вам нужно сделать удаляет стиль из шаблона и перемещает его в элемент в шаблоне

. Обратите внимание, что контекст элемента управления элементами - это элемент, а не элемент управления, т.е. ComboBoxItem для ComboBox, а не сам ComboBox, в этом случае вы должны использовать элементы управления ItemContainerStyle вместо

0
ответ дан MikeT 20 August 2018 в 11:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: