Привязка содержимого CellTemplate объекта DataGrid к элементу или свойству DependencyProperty, определенному в шаблонном CustomControl - PullRequest
1 голос
/ 23 февраля 2012

Я использую обычную DataGrid WPF внутри пользовательского элемента управления.Одно из содержимого шаблона ячейки DataGrid должно быть привязано к тексту текстового блока или к свойству DependencyProperty в пользовательском элементе управления.(Если бы я мог связать его с любым из них, это было бы достаточно для меня)

Я попытался выполнить следующее связывание с ElementName, но это не сработало.Я продолжаю получать DependencyProperty.UnsetValue -

<DataGridTemplateColumn Header="Test">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <ContentPresenter>
                <ContentPresenter.Content>
                    <MultiBinding Converter="{StaticResource TextToSpecialTextblockConverter}">
                       <Binding Path="SomeTextOnTheViewModel"/>
                       <Binding ElementName="SearchBox" Path="Text" Mode="OneWay"/>
                    </MultiBinding>
                </ContentPresenter.Content>
             </ContentPresenter>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Привязка к DependencyProperty также не работает.

<DataGridTemplateColumn Header="Test">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <ContentPresenter>
                <ContentPresenter.Content>
                    <MultiBinding Converter="{StaticResource TextToSpecialTextblockConverter}">
                       <Binding Path="SomeTextOnTheViewModel"/>
                       <Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="SomeDP" />
                    </MultiBinding>
                </ContentPresenter.Content>
             </ContentPresenter>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Я надеюсь, что кто-то может мне помочь!

Спасибо!

1 Ответ

4 голосов
/ 27 февраля 2012

Если свойство 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); }
    }
}
...