Привязка элементов в ItemsControl к DataContext ItemControl - PullRequest
1 голос
/ 10 октября 2011

У меня есть ComboBox с пользовательским ItemsTemplateSelector. Элементы для элемента управления определены в xaml, например:

<ComboBox ItemTemplateSelector="{StaticResource CommonListSelectorTemplates}" >
    <local:MyItem Heading="First" Text="First Item"/>
    <local:MyItem Heading="Second" Text="Second Item"/>
    <local:MyItemWithValue Heading="Third" Text="Third Item" Value="{Binding TheValue}" />
</ComboBox>

Третий элемент имеет свойство Value, которое я хочу связать со свойством TheValue в DataContext ComboBox. Эта привязка завершается с ошибкой:

"Не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = TheValue; DataItem = null; целевым элементом является 'MyItemWithValue' (HashCode = 49465727); целевым свойством является 'Value' (тип 'Int32')"

Полагаю, это потому, что коллекция Items не использует DataContext ComboBox. Я пробовал разные варианты RelativeSource без успеха, поэтому мой вопрос: каков наилучший способ выполнить связывание?

EDIT:

RV1987 ответил на мой вопрос, как было указано. Однако я хочу, чтобы связывание было двусторонним, и ни одно из предложенных решений, похоже, не сработало для этого. Проблема может заключаться в том, что я не могу сделать привязку в прокси двусторонней; компилятор отказывается принимать

DataContext = "{Binding, Mode = TwoWay}"

Ответы [ 3 ]

1 голос
/ 10 октября 2011

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

http://tomlev2.wordpress.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

Также посмотрите на это (та же проблема, но в данном случае ее сетка данных вместо выпадающего списка), как предложеноAngelWPF, это также было для меня чем-то новым -

Видимость столбца таблицы привязки MVVM

Редактировать - Более того, вам нужно установить режим привязки Двунаправленный в вашем комбинированном элементе вместоустановив его в StaticResource.Это должно работать -

<local:MyItemWithValue Heading="Third" Text="Third Item" Value="{Binding TheValue, Mode=TwoWay}" />
0 голосов
/ 10 октября 2011

Я бы подумал, что самым быстрым решением было бы просто связать свойство ComboBox s DataContext.Вы должны быть в состоянии обойти проблемы с RelativeSource, используя именованный элемент:

<ComboBox x:Name="combo" ItemTemplateSelector="{StaticResource CommonListSelectorTemplates}" >
    <local:MyItem Heading="First" Text="First Item"/>
    <local:MyItem Heading="Second" Text="Second Item"/>
    <local:MyItemWithValue Heading="Third" Text="Third Item"
        Value="{Binding DataContext.TheValue, ElementName=combo}" />
</ComboBox>
0 голосов
/ 10 октября 2011

local:MyItemWithValue не является FrameworkElement, поэтому он не может наследовать ComboBox DataContext.
См. эту заметку :
"WPF не будет добавлять контекст наследования для пользовательских классовв текущей версии, поэтому вторая привязка не может разрешить ссылку «контекст данных», если вы хотите включить эту привязку, просто подкласс из FrameworkElement или FrameworkContentElement. "

...