2011-01-06 2 views
0

У меня есть следующий код XAML:Привязка к ItemsPresenter собственности

<ItemsControl ItemsSource="{Binding...}" > 
    <ItemsControl.Template> 
     <ControlTemplate> 
      <ItemsPresenter x:Name="testGrid"/> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <!--Use the ItemsPanel property to specify a custom UniformGrid that 
    holds the laid out items.--> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <tools:UniformGridRtL Columns="8" x:Name="testGrid2" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <!--Use the ItemTemplate to set a DataTemplate to define 
     the visualization of the data objects. This DataTemplate 
     specifies that each data object appears RegisterBit appears 
     as a CheckBox bound to RegisterBit properties. It also defines 
     a custom template for the checkbox.--> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox... /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

<Label> 
    <Binding ElementName="testGrid2" Path="property_of_UniformGridRtL"/> 
</Label> 

В принципе, у меня есть пользовательские панели (UniformGridRtL) установить в качестве ItemsPanelTemplate, который будет шаблон по ItemsPresenter в ItemsControl. UniformGridRtL имеет свойство, с которым я хотел бы привязываться, но ElementName, похоже, не работает в привязке меток. Как связать свойство сгенерированного объекта ItemsControl?

ответ

0

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

Как обходный, попробуйте подписавшись на нагруженный случае панели (в данном случае <tools:UniformGridRtL Loaded="grid_Loaded" .../>), а затем установить привязку вручную в коде:

private void grid_Loaded(object sender, RoutedEventArgs e) 
{ 
    Binding binding = new Binding("NameOfGridPropertyToBindTo"); 
    binding.Source = sender; 
    boundLabel.SetBinding(Label.ContentProperty, binding); 
} 

Код выше предполагает что-то вроде <Label Name="boundLabel"/> для ваше объявление метки.

+0

Спасибо за обход ... Это действительно работает, если цель привязки также не является элементом-шаблоном. Что произойдет, если я хочу привязываться к элементу sibling в том же элементе ItemsControl ControlTemplate? – Mart

+0

Если у вас есть исходный элемент для родного брата, вместо использования использования отправителя (namedItemsControl) .Template.FindName(), как описано здесь: http://stackoverflow.com/questions/820201/how-to-access-a-wpf- control-found-in-a-controltemplate –

+0

Извините, мой комментарий отключен - если шаблон настроен, вы можете использовать ту же стратегию с Template.FindName(), что и код просто становится немного грязнее. Обязательно по-прежнему используйте какое-либо событие Loaded, хотя или у вас еще не будет визуального дерева, а FindName вернет значение null. –

Смежные вопросы