Если свойство Property
определено в модели представления, установленной на DataContext
элемента управления или DataGrid
, то этот пример работает:
Ресурсы:
<DataTemplate x:Key="template">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Test"/>
<TextBlock Text="{Binding Path=DataContext.Property,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
</StackPanel>
</DataTemplate>
DataGrid
<DataGrid ItemsSource="{Binding Items}" ...>
<DataGrid.Columns>
<DataGridTemplateColumn CellTemplate="{StaticResource template}" />
Уведомление об изменении DependencyProperty может обновить модель представления.
Например:
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof (string), typeof (DataGridComboBoxColumn), new PropertyMetadata(default(string), PropertyChangedCallback));
public string Test
{
get { return (string) GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
((MyControl) dependencyObject).OnTestChanged();
}
private void OnTestChanged()
{
((MyViewModel) theGrid.DataContext).Property = Test;
}
Для привязки к свойству зависимости Test
с использованиемдля привязки шаблона используйте это
<DataTemplate x:Key="template2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Test: "/>
<TextBlock Text="{Binding Path=Test, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:CustomControl1}}}"/>
</StackPanel>
</DataTemplate>
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<DataGrid ItemsSource="{TemplateBinding ItemsSource}" AutoGenerateColumns="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Test" CellTemplate="{StaticResource template2}" />
</DataGrid.Columns>
</DataGrid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Где CustomControl1
public class CustomControl1 : ItemsControl
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof (CustomControl1),
new FrameworkPropertyMetadata(typeof (CustomControl1)));
}
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof (string), typeof (CustomControl1), new PropertyMetadata(default(string)));
public string Test
{
get { return (string) GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
}