Использование DataContext внутри пользовательского элемента управления - PullRequest
2 голосов
/ 10 января 2011

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

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

<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

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

<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 Ответ

5 голосов
/ 11 января 2011

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

Вы можете попытаться привязать ContentControl к его DataContext с помощью

<ContentControl x:Name="MainContentArea" Content="{Binding}" ...
...