2011-01-10 4 views
2

У меня есть настраиваемый элемент управления с ContentTemplate для отображения дочерних элементов управления. Контекст данных не проходит через мой DataTemplate, поэтому, когда я привязываю свой дочерний элемент управления, я не могу получить это значение. Я почти уверен, что я не выполняю это правильно в отношении DataTemplate, поэтому я был бы признателен за любую помощь. Я разбил проблему как маленький сценарий, насколько смогу.Использование DataContext внутри настраиваемого элемента управления

Во-первых, страница:

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:WpfApplication1" 
Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <ResourceDictionary> 
     <local:MainWindowViewModel x:Key="ViewModel" /> 
    </ResourceDictionary> 
</Window.Resources> 

<Grid DataContext="{StaticResource ViewModel}"> 
    <local:MyControl> 
     <local:MyControl.MainContent> 
      <DataTemplate> 
       <TextBlock Text="{Binding TextValue}" /> 
      </DataTemplate> 
     </local:MyControl.MainContent> 
    </local:MyControl> 
</Grid> 

Далее ViewModel:

Public Class MainWindowViewModel 
    Implements INotifyPropertyChanged 

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 

    Private _textValue As String 
    Public Property TextValue() As String 
     Get 
      If String.IsNullOrEmpty(_textValue) Then 
       _textValue = "A default value" 
      End If 

      Return _textValue 
     End Get 
     Set(ByVal value As String) 
      _textValue = value 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("TextValue")) 
     End Set 
    End Property 
End Class 

И теперь мой пользовательский элемент управления с выделенным кодом:

Public Class MyControl 
    Inherits System.Windows.Controls.Control 

    Shared Sub New() 
     DefaultStyleKeyProperty.OverrideMetadata(GetType(MyControl), New FrameworkPropertyMetadata(GetType(MyControl))) 
    End Sub 

    Public Property MainContent As DataTemplate 
     Get 
      Return GetValue(MainContentProperty) 
     End Get 

     Set(ByVal value As DataTemplate) 
      SetValue(MainContentProperty, value) 
     End Set 
    End Property 

    Public Shared ReadOnly MainContentProperty As DependencyProperty = _ 
          DependencyProperty.Register("MainContent", _ 
          GetType(DataTemplate), GetType(MyControl), _ 
          New FrameworkPropertyMetadata(Nothing)) 

End Class 

И, наконец, , мой пользовательский cont Определение рол:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:WpfApplication1"> 


<Style TargetType="{x:Type local:MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyControl}"> 
       <StackPanel> 
        <TextBlock Text="Hello, World!" /> 
        <ContentControl x:Name="MainContentArea" ContentTemplate="{TemplateBinding MainContent}" /> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Когда это выполняется, значение из ViewModel (TextValue) не связан.

+1

ContentControl немного особенным в отношении к DataContext. DataContext в DataTemplate является содержимым ContentControl, а не его DataContext. Я не пробовал ваш код, но после быстрого взгляда у меня возникли чувства, это ваша проблема. –

+0

@Meleak. Спасибо за ваш ответ. У меня было ощущение, что DataContext не прошел. Можете ли вы порекомендовать другой способ сделать это? Мне нужно, чтобы несколько элементов управления загружались в определенных местах моего настраиваемого элемента управления. –

+1

Вы можете попытаться связать «Content» ContentControl с его DataContext с помощью

ответ

5

ContentControl является немного особенным в отношении DataContext. DataContext в пределах DataTemplate является содержимым ContentControl, а не его DataContext. Я не пробовал свой код, но после того, как быстрый взгляд у меня есть чувства, что ваша проблема

Вы могли бы попытаться связать содержание ContentControl его DataContext с

<ContentControl x:Name="MainContentArea" Content="{Binding}" ... 
Смежные вопросы