У меня есть настраиваемый элемент управления с 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) не связан.
ContentControl немного особенным в отношении к DataContext. DataContext в DataTemplate является содержимым ContentControl, а не его DataContext. Я не пробовал ваш код, но после быстрого взгляда у меня возникли чувства, это ваша проблема. –
@Meleak. Спасибо за ваш ответ. У меня было ощущение, что DataContext не прошел. Можете ли вы порекомендовать другой способ сделать это? Мне нужно, чтобы несколько элементов управления загружались в определенных местах моего настраиваемого элемента управления. –
Вы можете попытаться связать «Content» ContentControl с его DataContext с помощью