2013-02-27 2 views
0

У меня есть элемент управления, унаследованный от Listbox. Часть XAML выглядит следующим образом:WPF Как установить DataContext

<ListBox x:Class="Bibliothek.myDockControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     x:Name="myListBox" 
     > 
<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Height" Value="{Binding ItemHeight, UpdateSourceTrigger=PropertyChanged}"/> 
     <Setter Property="Template">   
      <Setter.Value> 
       <ControlTemplate TargetType="ListBoxItem"> 
        <Border BorderThickness="1" BorderBrush="Black" CornerRadius="2"> 
         <DockPanel> 
          <StackPanel DockPanel.Dock="Top" Background="LightGray"> 
           <DockPanel Margin="2,2,2,2"> 
            <TextBlock x:Name="Beschreibung" DockPanel.Dock="Left" VerticalAlignment="Center" FontWeight="Bold" Text="{Binding Header,UpdateSourceTrigger=PropertyChanged}"></TextBlock> 
           </DockPanel> 
          </StackPanel> 
          <ContentPresenter DockPanel.Dock="Top" Content="{Binding Content}"></ContentPresenter> 
         </DockPanel> 
        </Border>           
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 

Я привязки для TextBlock и для ContentPresenter. эти привязки взяты из моего собственного типа DockItem. Похоже, это:

public class DockItem 
{ 
    public string Header { get; set; } 
    public object Content { get; set; } 
} 

это свойство для связывания устанавливаются в окне, где я тестировал контроль и составляю от станда ObservableCollection, который привязан к какому-на ItemSource из списка.

, когда я добавил привязку для свойства Height, как указано выше (ItemHeight), который объявлен в коде позади, я не знаю, как установить datacontext. Если я установил datacontext в codebehind элемента управления listbox следующим образом: DataContext = this; то привязки для заголовка и содержимого не работают.

ответ

2

Вы пытаетесь установить два разных контекста данных на один ListBoxItem. Если вы определенно хотите взять ItemHeight из родительского окна, то вы можете сделать это следующим образом:

<Setter Property="Height" Value="{Binding ItemHeight, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/> 

Не забудьте осуществить preperty изменил уведомление, хотя, или он won`t реагировать на изменения. В качестве альтернативы вы можете добавить ItemHeight в класс DockItem, тогда ваш текущий подход будет работать нормально.

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